<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Overthought by Mike</title><description>Overthought is a personal, a bit technical blog created by Mike.</description><link>https://overthought.me/</link><language>en-us</language><item><title>The Bridge That Trembles: A Manifesto for the Divergent</title><link>https://overthought.me/blog/06-the-bridge-that-trembles/</link><guid isPermaLink="true">https://overthought.me/blog/06-the-bridge-that-trembles/</guid><description>A manifesto for those whose brains are built not for the steady road, but for the storm.</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Friedrich Nietzsche never wrote these words, but his ghost certainly haunts them. This piece is a creative exploration and homage to his work Thus Spoke Zarathustra. It takes his concept of the Übermensch—the self-actualized individual who creates their own values—and views it through the lens of the ADHD mind. It is a manifesto for those whose brains are built not for the steady road, but for the storm.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have seen the &quot;sober ones,&quot; and I have seen the &quot;punctual ones.&quot; They blink and say, &quot;We have found the rhythm of the clock,&quot; and they measure out their lives in small, predictable spoonfuls. But I ask you: who shall be the one to dance when the music is discordant?&lt;/p&gt;
&lt;p&gt;The path to the &lt;strong&gt;Übermensch&lt;/strong&gt; is a path of fire, but for you, my brothers of the lightning-mind, the fire does not merely burn—it flickers, it leaps, and it refuses to stay within the hearth. You, who are called &quot;scattered&quot; by the keepers of the Herd! You, who are shamed for your &quot;forgotten vows&quot; and &quot;unfinished altars&quot;! I tell you: one must still have chaos in oneself to give birth to a dancing star.&lt;/p&gt;
&lt;h3&gt;The Tyranny of the &quot;Straight Line&quot;&lt;/h3&gt;
&lt;p&gt;The world demands a &quot;constancy,&quot; a &quot;plodding gait,&quot; a &quot;single eye for a single task.&quot; This is the morality of the Camel! The Camel kneels and asks, &quot;What is heavy?&quot; and it carries the weight of the &lt;em&gt;Schedule&lt;/em&gt;, the &lt;em&gt;Routine&lt;/em&gt;, and the &lt;em&gt;Proper Order&lt;/em&gt;. It finds virtue in the long, grey road because it fears the forest.&lt;/p&gt;
&lt;p&gt;But the Lion of the Spirit arises! This Lion does not say &quot;I must finish.&quot; The Lion says: &lt;strong&gt;&quot;I will—for now!&quot;&lt;/strong&gt; The Herd calls your lack of &quot;persistence&quot; a vice. I call it the &lt;strong&gt;Holy Impatience&lt;/strong&gt;. You do not stick to one task because your spirit is too vast for the smallness of the task! You abandon the half-carved marble not because your hand is weak, but because your soul has already outrun the stone.&lt;/p&gt;
&lt;h3&gt;The Abyss of the Mundane&lt;/h3&gt;
&lt;p&gt;Verily, there is a demon that haunts the seeker, and its name is &lt;em&gt;The Trivial&lt;/em&gt;. To the one with the storm in his breast, the counting of grains is a greater death than the drowning in the sea. The Herd loves the counting! They find their &quot;truth&quot; in the ledger, the boundary, and the repetition.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Übermensch of the Restless Mind&lt;/strong&gt; must not become a clerk to his own life. He does not seek to &quot;fix&quot; the flickering of his focus—for a flame that does not flicker is a flame that is dying. He does not pray for the &quot;focus&quot; of the ox. Instead, he becomes the &lt;strong&gt;Master of the Moment&lt;/strong&gt;. He realizes that he is not a stream that flows in one direction, but a sea that surges at a thousand shores at once.&lt;/p&gt;
&lt;h3&gt;Amor Fati of the Flight&lt;/h3&gt;
&lt;p&gt;You must learn to love your &quot;distraction.&quot; Do not pray for a &quot;stilled&quot; mind; that is the prayer of the Last Man who wants to be a better sheep, sleeping soundly in the pen.&lt;/p&gt;
&lt;p&gt;Instead, practice &lt;strong&gt;Amor Fati&lt;/strong&gt;: Love your fate! Love the &quot;Frenzy&quot; that consumes the midnight oil! Love the &quot;Leap&quot; that carries you from one peak to another, skipping the valley entirely. The Herd only knows the valley; they call the leap a &quot;distraction&quot; because they cannot fly. &lt;/p&gt;
&lt;h3&gt;The New Law&lt;/h3&gt;
&lt;p&gt;I write this upon new tablets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The value of a work is not in its &quot;completion&quot; by the world’s clock, but in the &quot;intensity&quot; of the fire that forged it.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The &quot;Abandoned Path&quot; is not a failure; it is a footprint of a spirit that moves faster than the world can follow.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-Overcoming is not the silencing of the many voices within; it is the power to lead them as a choir, even when they sing in a hundred different keys.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;em&gt;Übermensch&lt;/em&gt; of the restless spirit is the one who realizes that &quot;Order&quot; is a cage built by the dull to keep the vibrant from shaking the foundations. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Be the lightning! Be the storm that the Herd fears!&lt;/strong&gt; And when they ask, &quot;Why can you not sit still?&quot; answer them: &lt;strong&gt;&quot;Because I am the bridge to something higher, and a bridge that does not vibrate under the wind is a bridge that will surely break.&quot;&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>ADHD</category><category>Neurodiversity</category><category>Philosophy</category></item><item><title>The ADHD Act: Why We Build Personas to Stop the Burn</title><link>https://overthought.me/blog/05-the-act-why-we-build-personas/</link><guid isPermaLink="true">https://overthought.me/blog/05-the-act-why-we-build-personas/</guid><description>Why do we put on a mask to feel &apos;normal&apos;?</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import AudioPlayer from &apos;../../../components/AudioPlayer.astro&apos;;&lt;/p&gt;

&lt;br /&gt; &lt;p&gt;Have you ever been in a simple conversation and felt like your brain was catching fire?&lt;/p&gt;
&lt;p&gt;On the outside, you look &quot;normal.&quot; But on the inside, your brain is at 100% capacity. You are manually processing every word, calculating a response, checking your posture, and running a real-time &quot;cringe-o-meter&quot; to ensure you haven&apos;t said anything weird.&lt;/p&gt;
&lt;p&gt;It is a literal, burning discomfort. It’s the friction of being &quot;too much&quot; in a world that asks you to be &quot;just enough.&quot; To stop that burn, we do something instinctual: we start &lt;strong&gt;The Act.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;The Problem of the Moving Target&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;One of the hardest parts of living with ADHD is that &lt;strong&gt;&quot;being yourself&quot; is a technical impossibility.&lt;/strong&gt; Our internal identity feels like a moving target—our interests, energy, and even our &quot;personality&quot; shift based on dopamine levels or how much we’ve slept.&lt;/p&gt;
&lt;p&gt;When your internal rules are fluid and disorganized, it’s hard to trust yourself in a social setting. &lt;strong&gt;You don’t know if &quot;you&quot; will be too loud, too distracted, or paralyzed by indecision.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is why we &quot;download&quot; characters. Unlike our own shifting sense of self, a persona has &lt;strong&gt;hardcoded rules.&lt;/strong&gt; By stepping into a character, we borrow a framework that doesn&apos;t fall apart under pressure. It’s not about being fake; it’s about installing a reliable Social OS because our own feels like it’s crashing.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;The Mechanics of the Armor&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;We often build these masks from visual cues—a photo of someone powerful, a specific fashion aesthetic, or a character in a movie. Our brain &quot;downloads&quot; the details: how they hold a glass, their cadence of speech, their physical stillness.&lt;/p&gt;
&lt;p&gt;But these aren&apos;t just &quot;vibes.&quot; They serve specific functional purposes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Tommy Shelby:&lt;/strong&gt; This is often triggered by heavy clothing—like a long winter coat. The weight provides proprioceptive input, and by acting stoic and quiet, we turn internal overwhelm into &quot;calm intensity.&quot; The racing thoughts are still there, but they are trapped behind a wall of granite. It&apos;s a way of converting chaos into something that &lt;em&gt;looks&lt;/em&gt; deliberate—a slow blink, a measured pause—when in reality, we&apos;re just trying not to vibrate out of our skin.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Proprioceptive Input:&lt;/strong&gt; The awareness of posture, movement, and changes in equilibrium, which grounds a restless nervous system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Claire Dearing:&lt;/strong&gt; Based on the &quot;Planner&quot; from &lt;em&gt;Jurassic World&lt;/em&gt;, this persona is hyper-organized. We use it when we&apos;re drowning in the &quot;shame of the unfinished&quot;—the stack of unanswered emails, the forgotten appointment, the half-completed task list. It allows us to act in control even when we&apos;re paralyzed by simple administrative tasks. The irony is that maintaining the illusion of organization often takes more energy than the actual work.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Tony Stark:&lt;/strong&gt; When the brain is moving too fast to stay still, we turn impulsivity into a feature. Stark provides the dopamine hit of being &quot;the smartest person in the room,&quot; which helps us push social anxiety into the background. We talk fast, deflect with humor, and steer conversations into territory where our hyperfocus becomes an asset instead of a liability. The crash comes later, when the room is empty and the performance has nowhere left to go.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Dr. House:&lt;/strong&gt; This is a defense against the agony of &quot;boring&quot; social norms. We act cynical or blunt to protect ourselves from the shame of not being able to handle small talk or illogical rules. Where other personas mask &lt;em&gt;into&lt;/em&gt; likability, this one masks into indifference—because if people think you &lt;em&gt;choose&lt;/em&gt; to be difficult, they stop expecting you to perform the social rituals that exhaust you most.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Leslie Knope:&lt;/strong&gt; This persona is pure hyperdrive people-pleasing. We become relentlessly helpful, enthusiastic, and agreeable—baking metaphorical (or literal) waffles for everyone around us. The function here is &lt;strong&gt;fawning&lt;/strong&gt;: a trauma-adjacent stress response where we prioritize everyone else&apos;s comfort to preemptively neutralize any possible friction or conflict. Research from the British Psychological Society identifies this as particularly common in women with ADHD, where the mask of perpetual agreeableness serves as an RSD shield. If we are &lt;em&gt;always&lt;/em&gt; giving, nobody has a reason to reject us. The cost is that we drain our own reserves to zero while smiling through every second of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Hermione Granger:&lt;/strong&gt; When emotions feel too chaotic and unpredictable, we retreat behind facts and preparation. Every answer is researched. Every conversation is steered toward the intellectual. We over-prepare for meetings, rehearse our talking points, and weaponize competence as a defense mechanism. This isn&apos;t just &quot;being smart&quot;—it&apos;s a deliberate strategy to control the one variable we can: the quality of our output. If we are undeniably &lt;em&gt;correct&lt;/em&gt;, the emotional messiness underneath becomes invisible. The exhaustion comes from the hours of invisible preparation that nobody sees—the three drafts of a casual email, the Wikipedia deep-dive before a dinner party.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Wednesday Addams:&lt;/strong&gt; Not everyone masks &lt;em&gt;up&lt;/em&gt; into a superhero. Some of us mask &lt;em&gt;down&lt;/em&gt; into a deliberately flat, detached observer. We minimize facial expressions, keep responses short, and project a deliberate stillness that says &lt;em&gt;&quot;I am choosing to be quiet&quot;&lt;/em&gt; rather than &lt;em&gt;&quot;I am overwhelmed and shutting down.&quot;&lt;/em&gt; This persona reframes social withdrawal as an aesthetic choice. It transforms the paralysis of overstimulation into something that looks intentional—even cool. The danger is that people stop reaching out entirely, and the isolation that started as a coping mechanism becomes its own cage.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These specific characters aren&apos;t a universal ADHD constant, but they are common blueprints many of us gravitate toward because they represent a level of control we often feel we lack. We aren&apos;t looking for a perfect fit; we are looking for a set of rules that feels right. Your personal roster might look completely different, built from different heroes or different inspirations, but the goal is the same: finding a framework that makes your internal world feel a little cooler.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Why the Armor is Necessary&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;We aren&apos;t doing this to be fake; we&apos;re very often doing it to manage &lt;strong&gt;Rejection Sensitive Dysphoria (RSD).&lt;/strong&gt; While not yet a formal diagnosis in the DSM-5, RSD is widely recognized by ADHD clinicians—and a 2024 neuroimaging study found that ADHD brains process social rejection using neural pathways similar to those activated by &lt;em&gt;physical pain&lt;/em&gt;. This isn&apos;t metaphorical. The sting of a dismissive comment can register with the same intensity as a slap. A 2025 theoretical model published via Sciety proposes that RSD may stem from &quot;inward-facing hyperfocus&quot;—where the brain becomes trapped in a cognitively demanding loop, replaying ambiguous social cues without the dopamine reinforcement needed to break free.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rejection Sensitive Dysphoria (RSD):&lt;/strong&gt; For an ADHD brain, rejection doesn&apos;t just &quot;sting&quot;—it can activate the same neural pain pathways as a physical injury. It&apos;s not a lack of resilience; it&apos;s a neurological difference in how rejection is processed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The mask acts as a buffer. If someone dislikes the &quot;character,&quot; they aren&apos;t rejecting the &lt;em&gt;real&lt;/em&gt; us. This armor protects our core from the sharp edges of social judgment. &lt;strong&gt;We aren&apos;t trying to deceive people; we are trying to survive the emotional stakes of being perceived.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Following these rigid rules also feeds the brain &lt;strong&gt;Dopamine.&lt;/strong&gt; The feeling of being powerful or brilliant generates the neurochemical fuel we need to stay focused. Behind the armor, the painful symptoms—the fidgeting and the mental static—finally recede. &lt;strong&gt;We play along not just because it looks good, but because it provides a genuine sense of relief.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;The Cost: The Crash and the Cringe&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;There is a heavy biological price for this. Acting is &lt;strong&gt;computationally expensive&lt;/strong&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Context Switching:&lt;/strong&gt; Switching between the &quot;Real Self&quot; and the &quot;Persona&quot; is cognitively expensive. The prefrontal cortex—the part of the brain responsible for executive functions like task-switching and impulse control, and consistently shown to be under-activated in ADHD—is already running at a deficit. Now it has to manage both the external conversation &lt;em&gt;and&lt;/em&gt; the internal script simultaneously. This is why sudden interruptions hit so hard: the system is already at capacity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource Allocation:&lt;/strong&gt; The &quot;Act&quot; isn&apos;t just a choice—it consumes the vast majority of your mental bandwidth, leaving almost nothing for things like working memory (why we forget names mid-conversation) or emotional regulation (why a minor comment can break the entire facade).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Cringe:&lt;/strong&gt; When the dopamine drops, we feel like impostors. We look back at the performance and feel embarrassed that we had to hide ourselves just to get through the day. This post-social rumination is closely tied to RSD—the brain replays every micro-interaction, searching for evidence that we &quot;failed.&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Crash:&lt;/strong&gt; This is ADHD Burnout. Maintaining a mask is exhausting. Research consistently links prolonged masking to heightened risks of anxiety, depression, and complete physical and mental shutdown. You aren&apos;t just &quot;tired&quot;—you are neurologically depleted, left with nothing after the performance ends.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;&lt;strong&gt;System Defragmentation&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;How do we safely &quot;power down&quot; the persona? The mask doesn&apos;t come with an off switch. After hours of performing, the nervous system is stuck in hypervigilance. You can&apos;t just &quot;relax.&quot; The system needs an active wind-down protocol.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Find your safe spaces.&lt;/strong&gt; Unmasking requires environments where the rules of performance don&apos;t apply. The qualifier is simple: &lt;em&gt;Can you stim, go quiet, or say something weird without consequence?&lt;/em&gt; Research consistently shows that neurodivergent people mask significantly less around other neurodivergent people. Seek these spaces out deliberately—they aren&apos;t luxuries; they are maintenance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use your body to ground the transition.&lt;/strong&gt; Proprioceptive input—heavy blankets, deep pressure, physical compression—can signal to the nervous system that it&apos;s safe to stand down. Occupational therapists recommend these as regulation tools, not because they &quot;fix&quot; anything, but because they give the body permission to stop performing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Name the Director.&lt;/strong&gt; Simply acknowledging &lt;em&gt;&quot;I was performing today, and now I need to stop&quot;&lt;/em&gt; is a cognitive reframe that separates you from the persona. The Director is exhausted. Validate that.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Schedule the crash.&lt;/strong&gt; If you know you&apos;ve been masking heavily, &lt;em&gt;block out&lt;/em&gt; the recovery time. The crash is coming regardless—the only variable is whether it happens on your terms or in the middle of a meeting.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Identity, Not Illness&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;This is not Dissociative Identity Disorder.&lt;/strong&gt; The distinction matters. In DID—rooted in severe childhood trauma—distinct personality states take executive control, often with amnesia between states. ADHD masking involves none of that. There is no amnesia. There are no &quot;alters.&quot; We are always the same person, always aware, always the Director.&lt;/p&gt;
&lt;p&gt;What we &lt;em&gt;are&lt;/em&gt; describing is closer to what psychologists call &lt;strong&gt;identity diffusion&lt;/strong&gt;: a sense of self that feels inconsistent because our internal experience shifts constantly—with our dopamine, our sleep, our environment. This isn&apos;t instability; it&apos;s the natural result of a nervous system that operates in peaks and valleys rather than a steady hum.&lt;/p&gt;
&lt;p&gt;The personas we build are not evidence of a fractured mind. They are &lt;strong&gt;scaffolding&lt;/strong&gt;—temporary structures we erect to navigate environments that weren&apos;t designed for us. The fact that we can step in and out of them at will, that we &lt;em&gt;know&lt;/em&gt; we were performing—that&apos;s proof of a fully intact, self-aware identity.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Identity diffusion means struggling to define a consistent &quot;self&quot; because your internal experience is always shifting. It does not mean losing yourself. You are always the Director—even when the Director is tired, confused, or wearing someone else&apos;s costume.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;strong&gt;It’s a Tool, Not a Flaw&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;We need to stop seeing this &quot;acting&quot; as something to be ashamed of. It’s your brain’s way of saying, &lt;em&gt;&quot;This environment is too high-friction for us right now, let me handle the interface so you can survive this.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You aren&apos;t a liar for wearing a mask. You are a person navigating a world that wasn&apos;t built for your brain. The &quot;cringe&quot; you feel afterward is just the proof that you value being authentic—it&apos;s the price you pay for the protection the character provided.&lt;/p&gt;
&lt;p&gt;And sometimes, that protection is the only thing that gets us home.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you&apos;re reading this while wearing the armor, remember: the armor is there to protect the pilot, not to replace him. It’s okay to step out of the suit when you’re back at the base.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>ADHD</category><category>Neurodiversity</category><category>Psychology</category></item><item><title>Reverse engineering my pancreas: syncing Libre Link Up with my ecosystem</title><link>https://overthought.me/blog/03-reverse-engineering-pancreas/</link><guid isPermaLink="true">https://overthought.me/blog/03-reverse-engineering-pancreas/</guid><description>The story of how I built a custom solution to sync my LibreLinkUp data with my ecosystem</description><pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I’ve been a Type 1 Diabetic since 2010, and if there’s one thing I’ve learned in over a decade of managing this condition, it’s that data silos are the enemy. I rely on Humalog and Levemir daily, but I also rely on data—lots of it.&lt;/p&gt;
&lt;p&gt;For a long time, I wanted raw access to my Freestyle Libre 3 sensors. The official apps are fine for viewing, but I needed to &lt;em&gt;own&lt;/em&gt; my data to build the ecosystem I actually wanted.&lt;/p&gt;
&lt;p&gt;That ecosystem starts with a library I built called &lt;strong&gt;&lt;code&gt;libre-link-unofficial-api&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Standing on the Shoulders of Giants&lt;/h2&gt;
&lt;p&gt;I didn&apos;t start from scratch. A huge amount of credit goes to the &lt;strong&gt;&lt;a href=&quot;https://github.com/DiaKEM/libre-link-up-api-client&quot;&gt;libre-link-up-api-client&lt;/a&gt;&lt;/strong&gt; by &lt;strong&gt;DiaKEM&lt;/strong&gt;. Their work in reverse-engineering the API was foundational.&lt;/p&gt;
&lt;p&gt;I decided to build my own implementation not to reinvent the wheel, but to learn. I wanted a complete, ground-up understanding of how the API worked so I could maintain it long-term and tailor it specifically to my stack.&lt;/p&gt;
&lt;h2&gt;The Library: A Technical Deep Dive&lt;/h2&gt;
&lt;p&gt;My implementation is a &lt;strong&gt;TypeScript&lt;/strong&gt; client designed specifically for the &lt;strong&gt;Bun&lt;/strong&gt; runtime. It handles the quirky authentication flow of the LibreLinkUp mobile app to give you programmatic access to your glucose levels.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Regional Routing:&lt;/strong&gt; It automatically handles regional redirects (e.g., EU vs US servers) by querying the country configuration endpoint.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streaming:&lt;/strong&gt; Instead of messy &lt;code&gt;setInterval&lt;/code&gt; loops, it uses async generators to stream readings.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// Stream readings every 90 seconds
for await (const reading of client.stream()) {
  const { value, trendArrow } = reading;
  console.log(`Glucose: ${value} mg/dL | Trend: ${trendArrow}`);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;The Ecosystem: PAVMS&lt;/h2&gt;
&lt;p&gt;But the library is just the entry point. I didn&apos;t want to hit Abbott&apos;s servers every time I needed to check my sugar history.&lt;/p&gt;
&lt;p&gt;I built a &quot;relay&quot;/&quot;aggregator&quot; system called &lt;strong&gt;PAVMS&lt;/strong&gt; (Personal Aggregated Vitals Management System). &lt;code&gt;libre-link-unofficial-api&lt;/code&gt; runs on a server, fetching data from the cloud and pushing it into PAVMS. PAVMS then acts as a central broadcast tower, exposing that data via a unified API to a suite of tools I built for myself.&lt;/p&gt;
&lt;p&gt;Because I control the data pipeline, I could put my glucose readings &lt;em&gt;everywhere&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VSCode Extension:&lt;/strong&gt; I can see my blood sugar in the status bar while I&apos;m coding, so I know if a syntax error is me or just low blood sugar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Obsidian Extension:&lt;/strong&gt; My personal knowledge base now has biological context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Desktop Integration:&lt;/strong&gt; I built custom taskbar icons for both Windows and Linux to keep readings at a glance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hardware Hacks:&lt;/strong&gt; I even gutted an IKEA humidity sensor and rewired it to act as a physical blood glucose display that sits in my living room.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Gaia: The AI Medical Assistant&lt;/h2&gt;
&lt;p&gt;The crown jewel of this stack is &lt;strong&gt;Gaia&lt;/strong&gt;, my custom mobile application.&lt;/p&gt;
&lt;p&gt;Standard apps don&apos;t know that my insulin sensitivity factor shifts dramatically throughout the day—from &lt;strong&gt;3.0&lt;/strong&gt; in the morning to &lt;strong&gt;1.5&lt;/strong&gt; at night. Gaia consumes the data from PAVMS, applies my specific correction factors, and runs a custom correction calculator.&lt;/p&gt;
&lt;p&gt;I even integrated an AI medical assistant into Gaia. It summarizes my current status and allows me to chat with my health data. By decoupling the data fetching (&lt;code&gt;libre-link-unofficial-api&lt;/code&gt;) from the logic (PAVMS/Gaia), I’ve built a system that adapts to me, rather than forcing me to adapt to a generic app.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;When your pancreas is running on manual mode, precision is just another word for survival. By taking control of the API, I’ve stopped reacting to my diabetes and started engineering around it.&lt;/p&gt;
&lt;p&gt;This library is my contribution to the open-source diabetes community. It includes integrity tests that run strictly every day at midnight to ensure the endpoints are still valid.&lt;/p&gt;
&lt;p&gt;If you are a developer and a T1D patient looking to build your own custom solution, give it a try.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bun install libre-link-unofficial-api
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>Type 1 Diabetes</category><category>LibreLinkUp</category><category>Libre</category><category>libre-link-unofficial-api</category><category>PAVMS</category><category>Gaia</category></item><item><title>Structured Hallucinations: Why We Tried (and Failed) to Turn Prompts into Code</title><link>https://overthought.me/blog/02-structured-hallucinations/</link><guid isPermaLink="true">https://overthought.me/blog/02-structured-hallucinations/</guid><description>I spent a weekend trying to force LLMs into the rigid structure of a compiler using ASTs and lockfiles. Here is the story of &apos;Intend&apos;, and why it failed.</description><pubDate>Sat, 31 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import CodeTabs from &apos;../../../components/CodeTabs.astro&apos;;&lt;/p&gt;
&lt;p&gt;We are currently watching a weird evolution in software development. We have &quot;No-Code&quot; developers and &quot;Pro-Code&quot; engineers, but the lines are blurring into a messy middle ground where everyone is just... prompting.&lt;/p&gt;
&lt;p&gt;The problem isn&apos;t that people are using AI to write code. The problem is &lt;strong&gt;how&lt;/strong&gt; they are doing it. It’s chaotic. It’s a stream of consciousness typed into a chat window. There are no guardrails. There is no structure. We are trying to build skyscrapers by shouting vague instructions at a very fast, very eager, but slightly hallucinating contractor.&lt;/p&gt;
&lt;p&gt;This lack of structure bothered me. So, I decided to do something about it.&lt;/p&gt;
&lt;p&gt;I spent a weekend of hyperfocus building &lt;strong&gt;Intend&lt;/strong&gt;—an experimental programming language designed to bridge the gap between human intent and machine implementation.&lt;/p&gt;
&lt;p&gt;I didn&apos;t build this alone. I built it &lt;em&gt;with&lt;/em&gt; Gemini. And I don&apos;t mean &quot;I asked Gemini to write it for me&quot;.&lt;/p&gt;
&lt;p&gt;This was a &lt;strong&gt;50/50 partnership&lt;/strong&gt;. I was the Architect; Gemini was the Contractor. I designed the AST, defined the constraints, and debugged the logic. Gemini wrote the parser boilerplate, suggested patterns, and—frequently—broke things in creative ways that forced me to rethink my design. It wasn&apos;t magic. It was engineering.&lt;/p&gt;
&lt;h2&gt;The Philosophy: Prompting with Seatbelts&lt;/h2&gt;
&lt;p&gt;The core hypothesis was simple: Prompts shouldn&apos;t be wishes; they should be specifications.&lt;/p&gt;
&lt;p&gt;I wanted to invert the workflow. I wanted a language where the human defines the boundaries—the types, the safety checks, the &quot;what must be true&quot;—and leaves the &quot;how&quot; entirely to the AI.&lt;/p&gt;
&lt;h2&gt;The Architecture of a Hallucination&lt;/h2&gt;
&lt;p&gt;To test this, we built a compiler.&lt;/p&gt;
&lt;p&gt;We created a file extension, &lt;code&gt;.intent&lt;/code&gt;. The goal was to give the AI &quot;&lt;strong&gt;Hollow Context&lt;/strong&gt;&quot;—feeding it only the shapes of data (interfaces, types) without distracting it with the implementation details of the entire codebase.&lt;/p&gt;
&lt;h3&gt;1. The Syntax (The Guardrails)&lt;/h3&gt;
&lt;p&gt;We didn&apos;t just regex the text files. We used &lt;strong&gt;Chevrotain&lt;/strong&gt; to build a real parser that generated an &lt;strong&gt;Abstract Syntax Tree (AST)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Why go through the pain of writing a lexer for a fake language? Because we needed to semantically separate &lt;strong&gt;Safety&lt;/strong&gt; from &lt;strong&gt;Logic&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Here is what &lt;em&gt;real&lt;/em&gt; Intend code looks like. It replaces function bodies with natural language steps, but keeps the strict typing of TypeScript. Crucially, it allows &lt;strong&gt;Direct Function Calls&lt;/strong&gt;—mixing AI fuzziness with deterministic code execution.&lt;/p&gt;
&lt;p&gt;&amp;lt;CodeTabs tabs={[&quot;example.intent&quot;, &quot;example.ts&quot;]}&amp;gt;
  &lt;/p&gt;&lt;div&gt;
    ```typescript
    import { User } from &quot;../types&quot;;&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export intent GenerateRandomId() -&amp;gt; string {
    step &quot;Generate a random numeric ID&quot; =&amp;gt; const id: number
    return id
}

export intent CreateUser(name: string) -&amp;gt; User {
    GenerateRandomId() =&amp;gt; const id
    step &quot;Create a User object with name, id, and current date&quot; =&amp;gt; const user: User
    
    return user
}

// Entry point 
export entry intent Main() -&amp;gt; void {
    step &quot;Using console, ask the user for their name&quot; =&amp;gt; const name

    CreateUser(name) =&amp;gt; const user

    invariant &quot;Throw an error if the user.name is &apos;sudo&apos; or &apos;root&apos;&quot;
    
    ensure user.name is not empty
    ensure user.id is not empty
    ensure user.createdAt is not undefined

    step &quot;Log &apos;Created user:&apos; and the user object to console&quot;
}
```
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
  &lt;div&gt;
    ```typescript
    import { User } from &quot;../types&quot;;&lt;pre&gt;&lt;code&gt;/**
* GenerateRandomId
* @returns string
*/
export function GenerateRandomId(): string {
    const id: number = Math.floor(Math.random() * 1000000);

    return id.toString();
}

/**
* CreateUser
* @param name - string
* @returns User
*/
export async function CreateUser(name: string): User {
    const id = await GenerateRandomId();
    const user: User = {
        id: id,
        name: name,
        createdAt: new Date()
    };
    return user;
}

/**
* Generated from intent: Main
* @returns void
*/
export async function Main(): void {
    const name = await prompt(&quot;Please enter your name:&quot;);

    if (!name) {
        throw new Error(&quot;User name cannot be empty.&quot;);
    }

    if (name === &apos;sudo&apos; || name === &apos;root&apos;) {
        throw new Error(&quot;User name cannot be &apos;sudo&apos; or &apos;root&apos;.&quot;);
    }

    const user = await CreateUser(name);

    if (!user.name) {
        throw new Error(&quot;User name is empty after creation.&quot;);
    }

    if (!user.id) {
        throw new Error(&quot;User ID is empty after creation.&quot;);
    }

    if (user.createdAt === undefined) {
        throw new Error(&quot;Creation timestamp is undefined after creation.&quot;);
    }

    console.log(`Created user:`, user);
}

// Entry Point Execution
// @ts-ignore
if (import.meta.main) {
    Promise.resolve(Main()).catch((err: any) =&amp;gt; console.error(err));
}
```
&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;
&lt;p&gt;By parsing this into an AST, we could construct what I called &quot;&lt;strong&gt;Smart Prompts&lt;/strong&gt;&quot;. We injected the &lt;code&gt;invariant&lt;/code&gt; block at the very top of the context window, telling the model: &lt;em&gt;&quot;If you violate these rules, the compiler will reject you.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;2. From CAS to Lockfiles (The Quest for Determinism)&lt;/h3&gt;
&lt;p&gt;The biggest problem with AI is that it&apos;s a slot machine. You pull the lever (run the prompt), and you get a different result every time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attempt 1: Simple Caching&lt;/strong&gt;
At first, I just implemented a crude &quot;Content Addressable Storage&quot; (CAS). I hashed the input prompt. If the hash matched, I returned the previous output.
&lt;em&gt;Problem:&lt;/em&gt; It wasn&apos;t enough. If I changed the &lt;em&gt;model temperature&lt;/em&gt; in the config, the hash stayed the same, but the output should have changed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attempt 2: The Lockfile&lt;/strong&gt;
I realized we needed something like &lt;code&gt;package-lock.json&lt;/code&gt;. We needed a source of truth that froze the hallucinations in time.&lt;/p&gt;
&lt;p&gt;We built a system that hashed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;Source Code&lt;/strong&gt; of the &lt;code&gt;.intent&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Configuration&lt;/strong&gt; (Model provided, Temperature, TopP).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If these hashes matched an entry in &lt;code&gt;intend.lock&lt;/code&gt;, we skipped the AI entirely. We just hydrated the &lt;code&gt;build/&lt;/code&gt; folder with the cached TypeScript code.&lt;/p&gt;
&lt;p&gt;This meant that &lt;code&gt;intend build&lt;/code&gt; on my machine produced the exact same binary as &lt;code&gt;intend build&lt;/code&gt; on CI. The stochastic nature of the LLM was tamed—until you edited the file.&lt;/p&gt;
&lt;h3&gt;3. The &quot;Self-Healing&quot; Loop (A.K.A. The Infinite Loop of Doom)&lt;/h3&gt;
&lt;p&gt;This was the feature I was most excited about. And it was the feature that broke my spirit.&lt;/p&gt;
&lt;p&gt;The idea was simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Generate code from &lt;code&gt;.intent&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run strict TypeScript validation on the output.&lt;/li&gt;
&lt;li&gt;If it fails, feed the error &lt;em&gt;back&lt;/em&gt; into the prompt and ask the AI to fix it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In theory, this is &quot;Agentic Coding.&quot; In practice, it was &quot;Agentic Whack-a-Mole.&quot;&lt;/p&gt;
&lt;p&gt;We ran into a recurring nightmare where the model would fix a type error, but in doing so, it would:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Re-implement imports:&lt;/strong&gt; Instead of using the &lt;code&gt;hash()&lt;/code&gt; function I imported, it would write its own (buggy) hashing logic inline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hallucinate APIs:&lt;/strong&gt; &quot;Oh, &lt;code&gt;UserSchema&lt;/code&gt; doesn&apos;t have an &lt;code&gt;id&lt;/code&gt;? Let me just add one to the interface definition.&quot; (No! You can&apos;t change the interface! That&apos;s the one thing you &lt;em&gt;can&apos;t&lt;/em&gt; change!)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Loop:&lt;/strong&gt; It would fix error A, causing error B. It would fix error B, causing error A. I sat there watching the terminal spin for 5 minutes, burning tokens, only to crash with &lt;code&gt;MaxRetriesExceeded&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. The Structure&lt;/h3&gt;
&lt;p&gt;We didn&apos;t want a &quot;magic folder&quot; that hid everything. We wanted a structure that felt native to a TypeScript developer. An Intend project looks suspiciously normal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;my-app/
├── intend.config.json   // Provider settings (Gemini/Ollama)
├── intend.lock          // The &quot;frozen&quot; hallucinations
├── src/
│   ├── types.ts         // Standard TS interfaces (The &quot;Hollow Context&quot;)
│   └── main.intent      // The hybrid AI/Code source
└── out/                 // The compiled, strict TypeScript
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You write in &lt;code&gt;src/&lt;/code&gt;, you commit &lt;code&gt;intend.lock&lt;/code&gt;, and you deploy &lt;code&gt;out/&lt;/code&gt;. It’s boring, and that was the point.&lt;/p&gt;
&lt;h3&gt;4. The Experience (Pluggable Brains &amp;amp; Shiny CLI)&lt;/h3&gt;
&lt;p&gt;We didn&apos;t just build a compiler; we built a product.&lt;/p&gt;
&lt;p&gt;We wanted this to feel like a premium developer tool, not a Python script hacking together API calls. We support &lt;strong&gt;Gemini&lt;/strong&gt; (for speed and reasoning depth) and &lt;strong&gt;Ollama&lt;/strong&gt; (for local, privacy-focused coding) out of the box.&lt;/p&gt;
&lt;p&gt;We also spent way too much time on the CLI. It features a beautiful, interactive interface (built with &lt;code&gt;@clack/prompts&lt;/code&gt;) that visualizes the &quot;thinking&quot; process of the compiler:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/02-structured-hallucinations/Screenshot_2026-01-31_153442.png&quot; alt=&quot;Intend CLI&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The Reality Check (Why We Shelved It)&lt;/h2&gt;
&lt;p&gt;On paper, Intend is the perfect bridge for the future of programming. But after the weekend fever dream wore off, we hit the wall:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. The &quot;Local&quot; Deception&lt;/strong&gt;
I wanted this to run on developers&apos; machines using local models (like &lt;code&gt;ollama/gemma3:12b&lt;/code&gt; or &lt;code&gt;llama3&lt;/code&gt;). I didn&apos;t want to pay Google for every compile.
&lt;em&gt;The Result:&lt;/em&gt; Small models are terrible at following negative constraints. They would look at &quot;Do not re-implement &lt;code&gt;hashFunction&lt;/code&gt;&quot; and immediately re-implement it. They lacked the &quot;reasoning&quot; depth to hold the entire AST context in memory without hallucinations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Latency is the Flow Killer&lt;/strong&gt;
A standard compiler runs in milliseconds. Intend, even with caching, ran in seconds (or minutes on a cache miss).
Waiting 45 seconds to see if your &lt;code&gt;if&lt;/code&gt; statement logic is correct effectively destroys the &quot;Flow State.&quot; You can&apos;t iterate. You start checking Twitter while your code compiles. That is death for productivity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Fragility&lt;/strong&gt;
Traditional code breaks when &lt;em&gt;you&lt;/em&gt; make a logic error. Intend code broke because the model &quot;felt different&quot; that day. We found that even with &lt;code&gt;temperature: 0&lt;/code&gt;, floating point determinism across different GPUs meant that sometimes, the code just... broke.&lt;/p&gt;
&lt;h2&gt;What&apos;s Next? (Or, How to Fix It)&lt;/h2&gt;
&lt;p&gt;Intend was a successful failure. It proved that while we &lt;em&gt;can&lt;/em&gt; wrap AI in the skin of a programming language, the underlying engine isn&apos;t quite rigid enough to act as a compiler. Attempting to force a creative, probabilistic engine into a deterministic, strict pipeline is fighting physics.&lt;/p&gt;
&lt;p&gt;However, the dream isn&apos;t dead. Here is how I would build Intend v2:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Two-Way Editing (Ejection):&lt;/strong&gt; Instead of &lt;code&gt;intent -&amp;gt; ts&lt;/code&gt;, we should allow the user to edit the generated TS files and have those changes reflect back (or at least &quot;eject&quot; from the AI flow entirely).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better Negative Constraints:&lt;/strong&gt; We need smarter prompting strategies (like Chain-of-Thought) to stop models from re-implementing imports or hallucinating APIs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hybrid Orchestration:&lt;/strong&gt; Leaning even harder into &quot;Direct Function Calls&quot;—letting the AI handle &lt;em&gt;only&lt;/em&gt; the fuzzy logic (like sentiment analysis) while strict code handles the payments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For now, I&apos;m back to writing TypeScript manually. But the idea of &lt;strong&gt;&quot;Architecting Constraints&quot;&lt;/strong&gt; rather than &lt;strong&gt;&quot;Writing Syntax&quot;&lt;/strong&gt; hasn&apos;t left my mind.&lt;/p&gt;
&lt;p&gt;We might just be a few years (or a few model generations) too early.&lt;/p&gt;
&lt;h2&gt;Resources&lt;/h2&gt;
&lt;p&gt;The project is open source and published on NPM. You can try the chaos yourself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Documentation:&lt;/strong&gt; &lt;a href=&quot;https://intend.fly.dev/&quot;&gt;intend.fly.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NPM:&lt;/strong&gt; &lt;a href=&quot;https://www.npmjs.com/package/@intend-it/cli&quot;&gt;&lt;code&gt;@intend-it/cli&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/@intend-it/parser&quot;&gt;&lt;code&gt;@intend-it/parser&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://www.npmjs.com/package/@intend-it/core&quot;&gt;&lt;code&gt;@intend-it/core&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href=&quot;https://github.com/DRFR0ST/intend&quot;&gt;github.com/DRFR0ST/intend&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just don&apos;t try to run it in production. Please.&lt;/p&gt;
</content:encoded><category>AI</category><category>LLM</category><category>Programming</category><category>Software Engineering</category></item><item><title>Nothing Done: How I Built an App with Help from AI to Manage My Daily Habits</title><link>https://overthought.me/blog/01-nothing-done/</link><guid isPermaLink="true">https://overthought.me/blog/01-nothing-done/</guid><description>I needed a simple, private habit tracker to get my life in order, so I built one. The twist? I had GitHub Copilot do most of the work. This is the story of Nothing Done — a functional app born from an experiment with AI that was both incredibly fast and hilariously messy.</description><pubDate>Thu, 10 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Carousel from &apos;../../../components/Carousel.astro&apos;;&lt;/p&gt;
&lt;p&gt;So, for the past couple of months, I&apos;ve been using a habit tracker I built for myself called &quot;Nothing Done.&quot; The name is a bit of a joke, and the look is a direct nod to the minimalist &lt;a href=&quot;nothing.tech&quot;&gt;Nothing&lt;/a&gt; aesthetic. I had just bought the new CMF Phone Pro 2 and wanted to build an app that felt like a native part of its design. The name is also a jab at my own productivity. The goal was simple: create a dead-simple, private, on-device habit tracker for my Android phone because, let&apos;s be real, most of the apps out there are just &lt;em&gt;too much&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;But here&apos;s the twist: I didn&apos;t build it alone. I had a sidekick, an AI coding assistant in the form of &lt;strong&gt;GitHub Copilot&lt;/strong&gt;. My role was more of a project manager, guiding the AI, and my own direct coding was minimal. The result? A functional app, a messy codebase, and some hard-earned lessons about the future of development.&lt;/p&gt;
&lt;h2&gt;The &quot;Why&quot;: An App for Me, by Me (and an AI)&lt;/h2&gt;
&lt;p&gt;I&apos;ve been a Type 1 diabetic since 2013, and I&apos;m pretty used to tracking things—blood sugar, insulin, carbs, you name it. But I wanted something for the other parts of my life, the simple, recurring habits that build a routine. Things like &quot;walk the dog&quot;, &quot;eat lunch&quot; or &quot;take insulin&quot;. The apps on the Play Store felt bloated, with features I&apos;d never use. I just wanted something that looked cool, was easy to use, and didn&apos;t have a full infrastructure to maintain with authentication, databases etc.&lt;/p&gt;
&lt;p&gt;So, &quot;Nothing Done&quot; was born. A simple, black-and-white app with a pinch of red that lives entirely on my phone (and partially in the Google Play Console in internal testing phase).&lt;/p&gt;
&lt;p&gt;&amp;lt;Carousel 
  images={[
    { src: &quot;/images/01-nothing-done/Screenshot_20250518-095140.png&quot;, alt: &quot;Nothing Done App Screenshot 07&quot; },
    { src: &quot;/images/01-nothing-done/Screenshot_20250528-025139.png&quot;, alt: &quot;Nothing Done App Screenshot 02&quot; },
    { src: &quot;/images/01-nothing-done/Screenshot_20250528-025007.png&quot;, alt: &quot;Nothing Done App Screenshot 03&quot; },
    { src: &quot;/images/01-nothing-done/Screenshot_20250528-024943.png&quot;, alt: &quot;Nothing Done App Screenshot 04&quot; },
    { src: &quot;/images/01-nothing-done/Screenshot_20250703-183721.png&quot;, alt: &quot;Nothing Done App Screenshot 01&quot; },
    { src: &quot;/images/01-nothing-done/Screenshot_20250523-152339.png&quot;, alt: &quot;Nothing Done App Screenshot 05&quot; },
    { src: &quot;/images/01-nothing-done/Screenshot_20250523-134542.png&quot;, alt: &quot;Nothing Done App Screenshot 06&quot; }
  ]}
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;The &quot;How&quot;: Letting Copilot Take the Wheel&lt;/h2&gt;
&lt;p&gt;From the get-go, I decided to lean heavily on Copilot. I&apos;d use the sidebar chat in &quot;Agent&quot; mode, and the AI would reason with itself, modify the code, from time to time ask to execute a command. It was... &lt;em&gt;fast&lt;/em&gt;. Incredibly fast and I was just a bystander. Components, hooks, UI elements—they all came together in a fraction of the time it would have taken me to write them from scratch. The initial version of the app was up and running within the first couple of hours of off-and-on work. My friends and family got to test the app the same day I started building it, and I was able to iterate quickly based on their feedback - all without writing much code myself. There were instances where I had to step in and modify some code to reach pixel perfection, but for the most part, Copilot handled the heavy lifting.&lt;/p&gt;
&lt;p&gt;But speed comes at a cost.&lt;/p&gt;
&lt;h2&gt;The Good, the Bad, and the AI-Generated Ugliness&lt;/h2&gt;
&lt;p&gt;Working with Copilot was like having a brilliant but slightly unhinged intern. It&apos;s great for boilerplate and simple logic, but it lacks context and, frankly, good taste sometimes. Here&apos;s the breakdown:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Good:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Speed:&lt;/strong&gt; I can&apos;t overstate this. Getting from zero to a working prototype was insanely quick.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boilerplate Be Gone:&lt;/strong&gt; Setting up components, contexts, and basic functions was almost instantaneous.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recovering After Mistakes:&lt;/strong&gt; If Copilot made a mistake, it would often suggest a fix and rewrite the code to correct it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Bad:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Trash Code:&lt;/strong&gt; The AI has a tendency to generate code over time that&apos;s... well, trash. Unused variables, overly complex logic for standard solutions, abandoned mechanisms and files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duplicate Logic:&lt;/strong&gt; This was the biggest issue. Copilot doesn&apos;t have a great memory of the entire codebase. If you keep pushing it to fix a more difficult issue, it could at some point write two completely separate (and slightly different) implementations of the same logic, or even worse, it would write a new implementation of the same logic in a different file, leaving the old one behind. This led to a lot of duplicated code and unnecessary complexity.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Ugly (and Broken):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Notification System:&lt;/strong&gt; This is where things really fell apart. I have at least two, maybe three, different implementations of the notification logic in the app. One in &lt;code&gt;app/_layout.tsx&lt;/code&gt;, another in a dedicated &lt;code&gt;scripts/NotificationService.ts&lt;/code&gt; module, and who knows where else. The result? A notification system that&apos;s buggy, unreliable, and a perfect example of AI-generated chaos. It schedules, cancels, and clears notifications in a way that&apos;s so convoluted, even the AI is not sure what it&apos;s doing half the time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Two Months In: The Verdict&lt;/h2&gt;
&lt;p&gt;So, after two months of using &quot;Nothing Done,&quot; what&apos;s the verdict?&lt;/p&gt;
&lt;p&gt;Honestly, it&apos;s been great. For all its flaws, the app &lt;em&gt;works&lt;/em&gt;. I&apos;ve been consistently tracking my habits, and it&apos;s been genuinely helpful. The simple, clean UI is exactly what I wanted, and the fact that it&apos;s 100% private is a huge plus.&lt;/p&gt;
&lt;p&gt;But every now and then, I&apos;m reminded of the AI-generated mess under the hood. A notification that doesn&apos;t fire or fires 5 times in a row, habit notes disappear, a moment where I think, &quot;I should really refactor that.&quot;&lt;/p&gt;
&lt;h2&gt;The &quot;What&apos;s Next&quot;: A Human Touch&lt;/h2&gt;
&lt;p&gt;The next step for &quot;Nothing Done&quot; is a human intervention. I&apos;m tempted to go back and refactor the entire app (maybe with help of &lt;code&gt;Claude Sonnet 4&lt;/code&gt; which I had great experience with lately), starting with that disaster of a notification system. It&apos;s a good reminder that AI is a powerful tool, but it&apos;s not a replacement for a developer with a clear vision and a bit of discipline.&lt;/p&gt;
&lt;p&gt;I&apos;ll probably still use Copilot for the cleanup, but this time, I&apos;ll be the one in charge. The AI can be the intern, but the final code review is on me.&lt;/p&gt;
&lt;h2&gt;A Quick Technical Dive&lt;/h2&gt;
&lt;p&gt;For those interested, here&apos;s a look at the tech stack for &quot;Nothing Done&quot;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Framework:&lt;/strong&gt; React Native with Expo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Language:&lt;/strong&gt; TypeScript&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI:&lt;/strong&gt; React Navigation, React Native UI Lib&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State Management:&lt;/strong&gt; React Context with custom hooks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Storage:&lt;/strong&gt; AsyncStorage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;And, of course:&lt;/strong&gt; A whole lot of GitHub Copilot&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Check It Out&lt;/h2&gt;
&lt;p&gt;The repository can be found on &lt;a href=&quot;https://github.com/DRFR0ST/nothing-done&quot;&gt;GitHub&lt;/a&gt;. It&apos;s open-source, so feel free to take a look, contribute, or just laugh at the mess I&apos;ve made. The app is not on Google Play Store yet, but if you want to give it a spin, you can use the APK (if you&apos;re not scared to install from unknown source): &lt;a href=&quot;https://drive.google.com/file/d/1t20gwdeY-h2i2mpY-H6V4CssaXnNeJlk/view?usp=sharing&quot;&gt;Download APK&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&apos;s been a fun, weird, and educational journey. And I have a feeling this is just the beginning of what it means to build software in the age of AI. Now, if you&apos;ll excuse me, I have a habit to mark as &quot;Done.&quot; And a whole lot of code to fix.&lt;/p&gt;
</content:encoded><category>AI</category><category>GitHub Copilot</category><category>React Native</category><category>Productivity</category><category>Personal Project</category></item><item><title>The Overthinking Begins</title><link>https://overthought.me/blog/00-hello-you/</link><guid isPermaLink="true">https://overthought.me/blog/00-hello-you/</guid><description>Welcome to Overthought by Mike, where I share my thoughts on technology, life, and everything in between. Expect the unexpected.</description><pubDate>Thu, 16 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Hey there!&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;You&apos;ve stumbled upon &quot;Overthought by Mike&quot; – my digital playground where I&apos;ll be sharing a chaotic mix of thoughts, ideas, and observations. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expect the unexpected.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;I&apos;ll be diving deeper into the world of technology (think software, robotics, AI – you name it!), sprinkling in some philosophical musings, and sharing the occasional unpopular opinion. &lt;/p&gt;
&lt;p&gt;But wait, there&apos;s more! &lt;/p&gt;
&lt;p&gt;You&apos;ll also find:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dog training tips and tales:&lt;/strong&gt; Because who doesn&apos;t love a good doggo story? 🐶 &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The occasional recipe:&lt;/strong&gt; Because even this tech-obsessed mind needs to eat. 🍽️ &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Random rants and raves:&lt;/strong&gt; From the absurd to the profound, nothing is off-limits. 💭&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Opinions expressed here are &lt;em&gt;purely&lt;/em&gt; my own, and occasionally refined by an LLM.&lt;/li&gt;
&lt;li&gt;Expect the unexpected. &lt;/li&gt;
&lt;li&gt;Proceed with caution. 😉&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So grab a cup of coffee, tea, a joint or whatever your drug of choice is, settle in, and let&apos;s get overthinking! ☕️&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;Feel free to leave a comment below – I&apos;d love to hear your thoughts! 💬 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let the overthinking begin!&lt;/strong&gt; 🚀&lt;/p&gt;
</content:encoded><category>Introduction</category><category>Blog</category><category>Personal</category><category>Overthought</category></item></channel></rss>