<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>WorknDeath</title>
	<subtitle>A feed of the latest posts from our blog.</subtitle>
	<link href="https://WorkandDeath.com/feed.xml" rel="self"/>
	<link href="https://WorkandDeath.com/"/>
	<updated>2026-05-18T00:00:00Z</updated>
	<id>https://WorkandDeath.com</id>
	<author>
    <name>Rashell Smith</name>
    <email>workanddeathblog@gmail.com</email>
	</author>
	
    
    <entry>
      <title>Meaning in Inferior</title>
      <link href="https://WorkandDeath.com/blog/Meaning-in-Inferior/"/>
      <updated>2026-05-18T00:00:00Z</updated>
      <id>https://WorkandDeath.com/blog/Meaning-in-Inferior/</id>
      <content type="html"><![CDATA[
        <h2>The Clip That Started This</h2>
<p><em>Sinners</em> just won the Oscars. No one's surprised — it's a great film. But what caught my attention wasn't the win itself. It was a clip circulating about Ryan Coogler, the director, and where he says his first real introduction to Irish culture came from.</p>
<p>Not a documentary. Not a trip abroad. A Disney Channel movie called <em>Luck of the Irish</em>.</p>
<p>He talks about the river dancing scene — this big, loud, joyful moment in a movie most people barely remember. And yet, there it was, quietly sitting in his mind for years. Quietly shaping the sensibilities of the man who would eventually make one of the most celebrated films of the year.</p>
<p><em>Luck of the Irish</em> is not an Oscar-winning movie. Not by any measure. But it inspired one.</p>
<h2>What You Think Doesn't Matter, Matters</h2>
<p>I've never wanted my work out there. My code, my writing, whatever I'm making — it never felt good enough to share. The gap between what I imagined and what I actually produced always felt too wide, too embarrassing. So I kept things to myself. I told myself I'd put it out when it was good. When it was ready. When I could stand behind it.</p>
<p>But what if that's not the point?</p>
<p>Even imperfect work does something in the world. Maybe someone looks at your app, your documentation, your half-finished side project and thinks <em>I can do something 10 times better than this in my sleep.</em> And then they go and do it. That's still inspiration. You moved them. You gave them a reference point — even if that reference point was something to push against.</p>
<p>And if you never put it out, you never gave them that.</p>
<p>There's also something else that happens. You participate. You put yourself in the room. Like everyone at the gym who's sweating and struggling — you showed up. You did something. The person sitting at home trying to decide whether or not to get up and go in didn't do anything. I spent a long time being that person. Waiting until I was ready to be impressive before I'd let myself count.</p>
<h2>The Watercolor</h2>
<p>I've been picking up watercolor painting lately. I'm not skilled. I'm not even sure what I want to paint most of the time.</p>
<p>There was a day I got into a fight with my boyfriend as couples sometimes do. I needed somewhere to put it, so I picked up a brush, found a quick reference on Pinterest, and tried to copy it. It wasn't good. But if you squint hard enough, you can kind of see where the inspiration came from.</p>
<p>I put it on my mirror.</p>
<p>Now it catches the corner of my eye throughout the day, and I smile — because I made that. It's a small, crooked, imperfect little thing. And it gives me a piece of joy I didn't know I could feel. I didn't know I was allowed to feel that about something I made before it was perfect.</p>
<p>That painting is inferior by almost any standard. It's also mine. And it matters to me in a way that the imaginary perfect version never could, because the imaginary version doesn't exist. This one does.</p>
<p><em>People idolize greatness but not the mediocre work that got us there.</em></p>
<h2>What I Decided at 30</h2>
<p>I used to live in a loop: <em>I'll start when I'm ready. I'll put it out when it's good. I'll count it when it matters.</em></p>
<p>The problem is nothing ever felt ready, good enough, or worth counting. So I never started, never put anything out, and never let anything count.</p>
<p>When I turned 30, I decided that everything I do from this point forward counts. The code, the writing, the bad watercolors. All of it. Not because it's perfect — it won't be — but because doing the work is the point. The work I put out might inspire someone. It might inspire them to do better. It might catch someone on a bad day and give them a small, quiet reason to smile.</p>
<p>I never thought my work mattered because it was inferior. So I held it back, and I never gave myself the chance to grow past that inferiority. But Ryan Coogler watched a Disney Channel movie about a kid who discovers he's Irish, saw people dancing, and carried that with him into <em>Sinners</em>.</p>
<p>That's enough proof for me.</p>
<p>The inferior work matters. Put it out.</p>

      ]]></content>
    </entry>
	
    
    <entry>
      <title>The Paradox of Building Your Own Solution</title>
      <link href="https://WorkandDeath.com/blog/The-Paradox-of-Building-Your-Own-Solution/"/>
      <updated>2026-02-12T00:00:00Z</updated>
      <id>https://WorkandDeath.com/blog/The-Paradox-of-Building-Your-Own-Solution/</id>
      <content type="html"><![CDATA[
        <p>When I first started learning DSA I attempted well over 70 problems. I was failing at problems I had attempted 3 or more times. That's when I decided to create CodeMaster - a spaced repetition tool that would track what I got wrong and surface it again until I got it right.</p>
<p>I really did not anticipate how long it would take.</p>
<p>I spent most of my time testing and continuously changing the code. Sometimes it was just too unstable for regular use. I did eventually complete my application. And I have a working app and the same skill level I started with.</p>
<p>That's the paradox. I built a tool to get better at DSA, and building it consumed all the time I could have spent getting better at DSA.</p>
<hr>
<h2>The Checkbox Illusion</h2>
<p>I thought shipping would be the finish line. &quot;Once I can see over the hill, I'll be done&quot; was what I thought, and what kept me working ferociously.</p>
<p>Reality: shipping was the starting line. Maintenance, users, bugs, features - all of it was waiting on the other side. A product isn't a task you complete. It's a commitment you maintain.</p>
<p>Now that I'm using it constantly I see so many more opportunities for improvement. What was a bug-infested rent-controlled complex is now less infested and could probably get top dollar on the free market. Too bad it's open source. I keep two versions of the application now - one that's stable for my actual use, and another for continuous integration and improvements. Because I learned the hard way that you can't study on a platform you're actively breaking.</p>
<hr>
<h2>Perfection for Who?</h2>
<p>I wanted my application to be perfect before releasing. The drive toward perfection was misguided. I wanted CodeMaster to be successful, and I hoped creating a perfect application would get me there. I wanted it to be all-encompassing, a full learning engine, so I incorporated a lot of moving parts.</p>
<p>I bet you aren't surprised when I tell you I never reached perfection.</p>
<p>I spent so much time on it that it got to the point where I just had to make it public because I actually wanted to get back to learning DSA and applying to jobs. I wanted this application on my portfolio. It just got to the point where I couldn't justify spending more time on it.</p>
<hr>
<h2>The Integration Tax</h2>
<p>Each new feature must integrate with everything existing. I wanted CodeMaster to be adaptive to a user's performance. To do that means a lot of integration points. The app barely asks users for input - there's really only one form where we're regularly collecting anything, the problem submission page, and even there two of the inputs are automatically filled from LeetCode.</p>
<p>My session system has 3 layers:</p>
<ul>
<li>Layer 1: Spaced repetition engine (FSRS schedule)</li>
<li>Layer 2: New problem handling (pattern ladders, tag relationships, difficulty scaling)</li>
<li>Layer 3: Session generation (combining review + new problems)</li>
</ul>
<p>Seems simple. But there's a 4th layer that integrates between everything else. To control stagnation and session composition I added escape hatches for when a user is stuck on one difficulty of problem. Just recently I fixed a bug where we were creating sessions that were all hard problems. Seeing that annoyed me. I didn't want to even attempt the session, so I waited for it to go stale and trigger the regeneration script to create a new one.</p>
<p>Can you believe I went to check my numbers on the Chrome extension store and it dropped from 5 whole users to 3? All that integration work. For 3 people.</p>
<hr>
<h2>The Paradox Resolved Itself</h2>
<p>I spent so long building CodeMaster that I forgot why I was building it. The app was supposed to get me better at DSA. Instead it became the thing I poured all my time into while my actual skills stayed the same.</p>
<p>But now it exists. It works. And I'm finally using it for what it was meant for.</p>
<p>The paradox didn't resolve because I figured out the perfect balance between building and studying. It resolved because I eventually just stopped. Stopped adding features. Stopped chasing perfection for 3 users. Stopped treating the tool like it was the goal. I closed the IDE and opened a problem.</p>
<p>Sometimes the best feature you can ship is the decision to stop shipping features.</p>

      ]]></content>
    </entry>
	
    
    <entry>
      <title>AI Doesn&#39;t Know Your Why - The New Bar for Developers</title>
      <link href="https://WorkandDeath.com/blog/AI-Doesnt-Know-Your-Why-The-New-Bar-for-Developers/"/>
      <updated>2025-12-24T00:00:00Z</updated>
      <id>https://WorkandDeath.com/blog/AI-Doesnt-Know-Your-Why-The-New-Bar-for-Developers/</id>
      <content type="html"><![CDATA[
        <p>The bar for building software has shifted. It used to be: can you build it? Now, with AI, almost anyone can.</p>
<p>With tools like Google Antigravity, the cost to create an application has dropped dramatically. You can delegate entire tasks to AI agents. You can ship without fully understanding what you shipped.</p>
<p>But understanding isn't required to build anymore. It is required to maintain.</p>
<p>Building an app is no longer impressive on its own. The new question is: how long did you maintain it? Because that takes real understanding.</p>
<hr>
<h2>Why Maintenance Is the New Proof</h2>
<p>I've been reading <em>Clean Code</em> while refactoring CodeMaster. Each chapter sends me back through the codebase looking for places to improve. Here's what I've learned: when you're working with a mature codebase, most of the decisions have already been made.</p>
<p>That's a double-edged sword. Early on, large sweeping changes were easy because my patterns weren't established yet. The code was flexible. But as the project grew, those early decisions hardened into constraints I had to live with or fight against.</p>
<p>Some of those early decisions were mistakes I didn't recognize until maintenance forced me to.</p>
<h3>The Mantine Problem</h3>
<p>When I started CodeMaster, I asked AI what stack would make the most sense for a Chrome extension. I didn't look too deeply into the npm packages it recommended. I searched them to make sure they existed and that the documentation said they could do what I needed. That was enough to move forward.</p>
<p>Mantine was one of those choices. A React component library. Clean, well-documented, easy to use. AI suggested it, the docs looked good, so I went with it.</p>
<p>Towards the end of the project, right before releasing to the Chrome Store, I noticed something: I had a lot of Mantine style overrides in my CSS. When I was implementing the onboarding flow, I was constantly fighting with Mantine's styles. Every component needed tweaks. Every layout required workarounds.</p>
<p>Then I stopped and asked: why am I doing all this work to fix a problem that shouldn't exist?</p>
<p>Mantine is designed for standalone applications. I was using it in a content script that overlays LeetCode pages. The styles were conflicting because the library wasn't meant for my use case. I had to pull Mantine out of the content script entirely. I still use it for the dashboard pages where it works fine, but that refactor cost me time I wouldn't have spent if I'd understood the constraint from the start.</p>
<p>AI recommended the library. AI couldn't tell me it was wrong for my architecture. That required understanding the system I was building.</p>
<hr>
<h2>Why Architecture Matters Now</h2>
<p>The Mantine problem wasn't just a maintenance issue. It was an architecture issue. I didn't understand how the pieces of my application fit together.</p>
<p>AI can write components. It can't decide where they belong.</p>
<p>It used to be that you had to build applications backwards. You had the big picture of what you wanted, then you broke it into confetti and had to piece it back together. You built your UI component by component, like assembling a puzzle one corner at a time. Then you moved to your backend. Then you figured out your services.</p>
<p>Now you can bring your full idea to AI. We don't have to carry the little pieces of the picture anymore. AI handles the confetti.</p>
<p>So what's left for the developer? Seeing how the pieces fit. Knowing which pieces to use in the first place. Knowing that a standalone component library doesn't belong in a content script. That's architecture—understanding your system well enough to make decisions AI can't make for you.</p>
<p>I don't think AI will ever create an application end-to-end with just one prompt. It works in controlled environments. &quot;Build a Facebook clone&quot; gets close because there's plenty of documentation. But for something truly new, AI can only remix the old. It can tell you what's likely to work and what won't. It can't envision what doesn't exist yet.</p>
<p>And it can't see your whole system at once. It doesn't know that your Chrome extension has three different contexts: background script, content script, dashboard. Each with different constraints. It doesn't know that a choice that works in one context creates problems in another. Only you can hold that picture in your head.</p>
<hr>
<h2>The New Developer</h2>
<p>With this level of abstraction, you need a new type of developer. One who can zoom in and out.</p>
<p>Zoom in: debug the CSS conflict, trace the state bug, understand why this specific component breaks in this specific context. Zoom out: see how the content script relates to the background script, understand why a library that works in one place fails in another, hold the whole architecture in your head.</p>
<p>AI is excellent at the zoomed-in work. It can write the function, fix the syntax, suggest the solution. But it can't zoom out. It doesn't have the context. It doesn't know your system.</p>
<p>Creation is cheap now. The value is in understanding: how the system is designed, how long you can keep it running, how deeply you know what you built.</p>
<p>The most important question when building is <em>why</em>. Why this architecture? Why this tool? Why does this piece belong here and not there? Features don't matter unless they're connected to a reason. The applications that succeed have a clear why behind every decision.</p>
<p>AI doesn't know your why. That's still yours.</p>

      ]]></content>
    </entry>
	
    
    <entry>
      <title>Maintaining CodeMaster - The Work That Comes After Shipping</title>
      <link href="https://WorkandDeath.com/blog/Maintaining-CodeMaster-The-Work-That-Comes-After-Shipping/"/>
      <updated>2025-12-16T00:00:00Z</updated>
      <id>https://WorkandDeath.com/blog/Maintaining-CodeMaster-The-Work-That-Comes-After-Shipping/</id>
      <content type="html"><![CDATA[
        <p>I shipped CodeMaster. Then I learned that shipping was the easy part.</p>
<p>For the last two months, I've been in maintenance mode. Refactoring. Rewriting. Breaking things, then fixing them, then breaking them again. The features all work. The app is live. But the codebase underneath? It was a mess I had to clean up.</p>
<p>This is the part no one talks about when they say &quot;just ship it.&quot;</p>
<h2>The 150-Commit Branch</h2>
<p>Most of my branches have one to three commits. Small, focused changes. But there's one branch in my git history with 150 commits. I call it my shame branch.</p>
<p>Here's what happened: I added a linting rule that enforces file size limits. Overnight, I had 180+ warnings. Files that had grown too big while I was focused on features. So I thought, &quot;I'll just fix all of these at once.&quot;</p>
<p>That was a mistake.</p>
<p>I started extracting helper functions, splitting files, reorganizing folders. Every change broke something else. I'd fix one regression and create two more. I was refactoring code I'd written when I didn't fully understand what I was building. The 150 commits were me stumbling through the mess I'd made.</p>
<h2>When You Move Fast, You Leave Messes Behind</h2>
<p>I used AI to build faster. ChatGPT and Claude were my constant companions. But building fast with AI created its own kind of debt.</p>
<p>I didn't write tests as I built. So later, I asked AI to write tests for bugs I kept hitting. But generating tests isn't the same as understanding what to test. I ended up with tests that were too tightly coupled to implementation details. When I refactored, the tests broke, and I couldn't tell if it was a real bug or just a test that needed updating. I had to throw a lot of them out.</p>
<p>Same with linting. At first my rules were too strict. AI is good at delegation, but if you're not reviewing the output carefully, the quality slips. While the foreman is out, the workers go out to play.</p>
<p>Every shortcut I took came back to haunt me.</p>
<h2>What I Should Have Done</h2>
<p>I set up linting rules and testing infrastructure on the same day back in July. But I didn't enforce them consistently. The rules existed, but they weren't blocking bad code from getting merged.</p>
<p>Now I start every new project differently:</p>
<ul>
<li>Linting rules from day one, enforced on every push</li>
<li>Tests written alongside features, not bolted on after</li>
<li>Small, focused refactors instead of trying to fix everything at once</li>
</ul>
<p>I also learned that tests should verify behavior, not implementation. The question isn't &quot;did it call this internal function?&quot; It's &quot;did it return the right data?&quot; If I'd understood that earlier, my tests would have survived the refactoring.</p>
<h2>Building vs. Keeping</h2>
<p>Building something and keeping it running are different skills.</p>
<p>When you're building, you're focused on making it work. Ship the feature. Fix the obvious bugs. Move fast. But maintenance requires a different mindset. You have to think about what happens six months from now when you've forgotten how this code works. You have to care about the code you're leaving behind, not just the feature you're adding.</p>
<p>I'm considering converting the project to TypeScript. Not because JavaScript doesn't work, but because TypeScript catches the exact bugs that kept biting me. Wrong data shapes. Missing properties. Functions returning different types than their callers expect. The compiler would have caught half my regressions before they happened.</p>
<h2>The Lesson</h2>
<p>Everyone celebrates shipping. But the project isn't done when it ships. It's done when you abandon it.</p>
<p>I spent two years building CodeMaster. I've now spent two months just cleaning it up. That ratio probably isn't unusual. The maintenance phase is long, unglamorous, and necessary.</p>
<p>If you're building your first real project, know this: the code you write today is code you'll have to maintain tomorrow. The shortcuts you take will come back. The tests you skip will haunt you.</p>
<p>Ship it. But then stick around for the hard part.</p>

      ]]></content>
    </entry>
	
    
    <entry>
      <title>Shipping CodeMaster - What I Learned Building My First Real Project</title>
      <link href="https://WorkandDeath.com/blog/Shipping-CodeMaster-What-I-Learned-Building-My-First-Real-Project/"/>
      <updated>2025-12-05T00:00:00Z</updated>
      <id>https://WorkandDeath.com/blog/Shipping-CodeMaster-What-I-Learned-Building-My-First-Real-Project/</id>
      <content type="html"><![CDATA[
        <p>I was blessed with a surplus of ideas but cursed with executive dysfunction. I find it hard to commit to something until the very end. I knew finishing would be the hurdle I'd have to get over.</p>
<p>I shipped CodeMaster. It's real. It's live. Here's what I learned.</p>
<h2>Showing Up Is the Job</h2>
<p>Starting projects was never the problem. I'm full of ideas. But finishing? That's where I always fell short.</p>
<p>The difference between a half-finished project and a shipped project isn't skill. It's showing up consistently, even when it stops being exciting.</p>
<p>Some days I was excited to work on CodeMaster. Other days it felt like a slog. But I showed up anyway. You don't have to feel motivated. You just have to show up.</p>
<h2>I Used AI. It Didn't Save Me.</h2>
<p>I'm not gonna lie ChatGPT was my constant companion. I'd ask it why things weren't working, help me decode errors, think through problems out loud.</p>
<p>But AI didn't save me from my own simple mistakes. I had bugs that came from not understanding how Chrome extensions work things I should have known if I'd read the documentation.  That equals wasted time I could not cut.  AI could fix symptoms, but it couldn't give me foundational understanding. I had to earn that.</p>
<h2>Scope Creep Almost Killed This Project</h2>
<p>This app was supposed to be an MVP.</p>
<p>Then I showed someone an early version and they were wildly unimpressed. So my insecure self just started adding features. Whatever made sense, I put in. That's why this is no longer an MVP—it's a full-fledged app.</p>
<p>I spent two years working on this by myself, not showing anyone. That was insane. I shouldn't have done that.</p>
<p>I can't say I regret it I'm proud of what this became. But I would iterate faster next time. Show it sooner. If you're building something for other people, it should be shown to other people. By hiding it, I wasn't creating the best possible application. I didn't have to do it alone.</p>
<p>Building in public builds up contacts. People get you in their heads an idea of who you are, what you're trying to build. I could have built up a user base. I could have gotten feedback earlier. That's one of my biggest lessons: iterate faster and show people what you're building.</p>
<h2>Building Alone Requires Systems</h2>
<p>When you're building alone, you can't rely on motivation. You need systems.</p>
<p>For me, that meant:</p>
<ul>
<li><strong>Weekly goals</strong>: Not &quot;finish the feature,&quot; but &quot;work on it for 5 hours this week&quot;</li>
<li><strong>Breaking down tasks</strong>: Instead of &quot;build adaptive sessions,&quot; I'd write smaller issues—one function for reviewing problems, one for pulling new problems, then integrate. I'd define the problem, then solve it.</li>
<li><strong>Tracking progress</strong>: Git commits and a changelog to see how far I'd come. By the end I had over 500 commits.</li>
</ul>
<p>The systems kept me moving forward even when I didn't feel like it.</p>
<h2>Vision vs Reality</h2>
<p>I had this vision of what CodeMaster would be elegant, polished, every feature I dreamed of.</p>
<p>The reality was messier. Some features didn't work the way I imagined. The UI wasn't as smooth as I wanted. Bugs. Edge cases I hadn't considered.</p>
<p>But the gap between vision and reality is normal. It doesn't mean you're failing it means you're in reality, not a fairytale.</p>
<p>Shipped products are never perfect. They're just good enough to be useful.</p>
<h2>Shipping Builds Confidence</h2>
<p>Before CodeMaster, I felt like a fraud. I had certifications. I had done bootcamps. But I didn't have proof that I could execute.</p>
<p>Shipping one thing changes everything.</p>
<p>Now I have proof. I can point to CodeMaster and say: &quot;I built that. End to end. It works.&quot;</p>
<p>That confidence is real. It's not based on hope or potential it's based on evidence.</p>
<h2>What's Next</h2>
<p>More projects. More shipping. More proof.</p>
<p>Because at the end of it all, the only way I know if life was worth it is through what I was able to create.</p>

      ]]></content>
    </entry>
	
    
    <entry>
      <title>The Features That Make CodeMaster Work</title>
      <link href="https://WorkandDeath.com/blog/The-Features-That-Make-CodeMaster-Work/"/>
      <updated>2025-11-24T00:00:00Z</updated>
      <id>https://WorkandDeath.com/blog/The-Features-That-Make-CodeMaster-Work/</id>
      <content type="html"><![CDATA[
        <p>When I set out to build CodeMaster, I wasn't just trying to create another problem tracker. I wanted to build something that would actually help me learn and retain what I was studying.</p>
<p>Here's what I built and why each feature matters.</p>
<h2>1. The Leitner System for Spaced Repetition</h2>
<p>The core of CodeMaster is the <strong>Leitner system</strong>—a proven method for spaced repetition that helps you retain information long-term.</p>
<p>Here's how it works:</p>
<p><strong>Problems move through different &quot;boxes&quot; based on how well you know them.</strong></p>
<ul>
<li><strong>Box 1</strong>: Problems you just learned or struggled with (reviewed frequently)</li>
<li><strong>Box 2</strong>: Problems you're getting better at (reviewed less often)</li>
<li><strong>Box 3</strong>: Problems you've mastered (reviewed infrequently)</li>
</ul>
<p>If you solve a problem correctly, it moves to the next box. If you struggle, it moves back down. This means you spend more time on what you don't know and less time on what you've already mastered.</p>
<p><strong>Why this matters:</strong></p>
<p>The Leitner system ensures I'm actually learning, not just checking boxes. It also has <strong>cooldown logic</strong>—problems don't come back immediately. They space out over time based on which box they're in. This prevents burnout and mimics how our brains actually retain information.</p>
<h2>2. Pattern Ladders: Learning by Progression</h2>
<p>One of the biggest challenges with LeetCode is knowing what to practice next. There are thousands of problems, and it's easy to feel lost.</p>
<p>That's why I built <strong>pattern ladders</strong>.</p>
<p><strong>Pattern ladders guide your progression through algorithm types with tag-aware difficulty scaling.</strong></p>
<p>Instead of jumping randomly between topics, CodeMaster helps you:</p>
<ul>
<li>Start with easier problems in a pattern (like Arrays or Two Pointers)</li>
<li>Gradually increase difficulty as you improve</li>
<li>Move to the next pattern when you're ready</li>
</ul>
<p>This gives structure to your learning. You're not just solving random problems—you're building mastery step by step.</p>
<p><strong>Why this matters:</strong></p>
<p>When I was practicing without structure, I would avoid the hard topics. Pattern ladders force me to confront what I'm weak at, but in a way that feels manageable.</p>
<h2>3. Adaptive Sessions</h2>
<p>CodeMaster doesn't just give you random problems. It <strong>adapts based on your performance</strong>.</p>
<p>Adaptive sessions adjust based on:</p>
<ul>
<li><strong>Your tag performance</strong>: If you're struggling with dynamic programming, you'll see more of it</li>
<li><strong>Session results</strong>: If you failed a problem, it comes back sooner</li>
<li><strong>Recent inactivity</strong>: If you haven't practiced a topic in a while, it gets prioritized</li>
</ul>
<p>This means every study session is tailored to what you need most right now.</p>
<p><strong>Why this matters:</strong></p>
<p>Adaptive sessions make sure I'm using my time efficiently—working on what will actually move the needle.</p>
<h2>4. Dashboard Analytics</h2>
<p>CodeMaster includes a <strong>dashboard with visual analytics</strong> powered by Recharts.</p>
<p>You can see:</p>
<ul>
<li><strong>Tag mastery</strong>: Which algorithm patterns you've mastered and which need work</li>
<li><strong>Box distribution</strong>: How many problems are in each Leitner box</li>
<li><strong>Session trends</strong>: Your progress over time</li>
<li><strong>Problem activity</strong>: Which problems you've solved and when</li>
</ul>
<p><strong>Why this matters:</strong></p>
<p>Progress can feel invisible when you're learning algorithms. The dashboard makes it tangible. I can look at it and see: &quot;I've moved 15 problems to Box 3. I'm getting better at arrays. I need to work on graphs.&quot;</p>
<p>That visibility keeps me motivated.</p>
<h2>5. Extension Architecture: How It All Works Together</h2>
<p>The extension architecture was one of the trickiest parts to build. Chrome extensions have three main components that need to communicate:</p>
<ul>
<li><strong>Content script</strong>: Reads LeetCode's page and extracts problem information</li>
<li><strong>Popup UI</strong>: Where you interact with CodeMaster (built with React)</li>
<li><strong>Background service worker</strong>: Manages data and coordinates between components</li>
</ul>
<p>Getting them to sync state without conflicts required building a custom message-passing system and careful IndexedDB management.</p>
<p><strong>The technical challenges:</strong></p>
<p>The biggest hurdle was state management. When you mark a problem as complete in the popup, that needs to update IndexedDB, refresh the dashboard, and notify the content script—all while handling race conditions and keeping data consistent.</p>
<p>I built a custom React hook (<code>useChromeMessage</code>) that handles all the message passing between components. It ensures that state updates flow smoothly and data doesn't get out of sync.</p>
<p><strong>Why this matters:</strong></p>
<p>Building the extension forced me to learn browser APIs deeply—something I wouldn't have gotten from a web app. Managing asynchronous state across multiple contexts taught me more about JavaScript than any tutorial could.</p>
<h2>6. Tag Mastery Engine</h2>
<p>CodeMaster tracks <strong>tag mastery</strong> behind the scenes using a scoring algorithm that weighs three factors:</p>
<ul>
<li><strong>Recency</strong>: When you last practiced a tag (older = lower score)</li>
<li><strong>Accuracy</strong>: Your success rate with that pattern (lower accuracy = lower score)</li>
<li><strong>Coverage</strong>: How many problems you've solved in that pattern (fewer problems = lower score)</li>
</ul>
<p>Tags with low scores get prioritized in your next session. It's like having a coach who knows exactly where your weak spots are.</p>
<p><strong>How it works in practice:</strong></p>
<p>Let's say you've mastered Arrays (high accuracy, recent practice, good coverage) but you've been avoiding Dynamic Programming (low accuracy, not practiced in weeks, few problems solved). The tag mastery engine will surface more DP problems in your adaptive sessions until your scores balance out.</p>
<p>The algorithm constantly adjusts based on your performance. If you ace a DP problem, its priority drops. If you struggle with an Array problem, Arrays get bumped back up.</p>
<p><strong>Why this matters:</strong></p>
<p>This automatic prioritization means you don't have to think about what to practice next. The system handles it for you based on your actual performance data, not your feelings about what you should work on.</p>
<h2>What I Learned Building These Features</h2>
<p>That's the thing about building something real. You have an idea of what it should be, and then you have to actually make it work.</p>
<p>Building CodeMaster taught me:</p>
<ul>
<li><strong>Spaced repetition isn't just theory</strong>—it actually works when you implement it right</li>
<li><strong>Adaptive algorithms are hard</strong>—figuring out how to prioritize problems took multiple iterations</li>
<li><strong>UI/UX matters</strong>—if the dashboard is confusing, people won't use it</li>
<li><strong>Chrome extensions have constraints</strong>—working with IndexedDB and message passing was a learning curve</li>
</ul>
<p>The features work. They help me learn. And that's what matters.</p>
<h2>The Result</h2>
<p>CodeMaster is a personalized learning and productivity Chrome Extension that helps developers master data structures and algorithms through a smart, pattern-based spaced repetition system.</p>
<p>It's not perfect. But it's real. And it's helping me get better at algorithms every day.</p>
<p>In the next post, I'll share what I learned shipping CodeMaster—the challenges, the surprises, and what I'd do differently.</p>

      ]]></content>
    </entry>
	
    
    <entry>
      <title>Why I Built CodeMaster (And Not Another Todo App)</title>
      <link href="https://WorkandDeath.com/blog/Why-I-Built-CodeMaster-And-Not-Another-Todo-App/"/>
      <updated>2025-11-24T00:00:00Z</updated>
      <id>https://WorkandDeath.com/blog/Why-I-Built-CodeMaster-And-Not-Another-Todo-App/</id>
      <content type="html"><![CDATA[
        <p>When you're building your first portfolio project, the advice is usually the same: start simple. Build a todo app. Build a calculator. Build something you've seen a hundred times before.</p>
<p>I didn't do that. I only wanted to spend my time building something I would be proud of. Something I was struggling with—so that even if I failed to make it a commercial success, it would still be a tool I could use to solve my own problems.</p>
<p>The problem I chose to solve was my own. I was preparing for technical interviews and drowning in LeetCode problems with no way to know if I was actually retaining what I learned. Every tool I tried felt like it was built for someone else's brain, not mine.</p>
<p>People might ask why make your first real project so complicated. It didn't start out that way. But I realized that building something I genuinely needed meant I'd actually finish it. If it failed commercially, I'd still have a tool that solved my problem. That made it worth the complexity.</p>
<h2>The Problem I Had</h2>
<p>When I started practicing LeetCode seriously, I quickly realized I had a problem. Not with solving problems—but with knowing if I was actually improving.</p>
<p>At first I just went over random easy problems—that was just me spinning my wheels for a couple weeks. Then I found the LeetCode Patterns curated list made by <a href="https://github.com/seanprashad">seanprashad</a>. It was helpful because it let me study related topics together. I had a route I could follow.</p>
<p>But I still felt like I was behind. I had no system. No way to track what I was getting better at. No way to know if I was actually improving or just staying busy. I couldn't tell you which patterns I had mastered and which ones I was still struggling with.</p>
<p>That was the problem.</p>
<h2>Why Not Use Existing Tools?</h2>
<p>There are a lot of tools out there for LeetCode practice. Problem trackers. Progress dashboards. Study plans.</p>
<p>But none of them worked the way my brain did.</p>
<p>I needed something that would:</p>
<ul>
<li><strong>Track my actual retention</strong>, not just whether I completed a problem once</li>
<li><strong>Adapt to my weaknesses</strong>, showing me more of the patterns I struggled with</li>
<li><strong>Use spaced repetition</strong>, so I wasn't just grinding problems but actually learning them</li>
<li><strong>Integrate with LeetCode directly</strong>, so I didn't have to manage two separate systems</li>
</ul>
<p>Every day I practiced, I wished it existed. So I built it.</p>
<h2>Why a Chrome Extension?</h2>
<p>A Chrome extension made sense because:</p>
<ul>
<li><strong>It lives where I study</strong>: Right on LeetCode, not in another tab I have to remember to open</li>
<li><strong>It's always accessible</strong>: Whenever I'm solving a problem, CodeMaster is there</li>
<li><strong>It felt challenging</strong>: I hadn't built a Chrome extension before, and I wanted to prove I could learn something new</li>
</ul>
<p>I didn't want to build another todo app because I don't need another todo app. I needed something that would help me get better at the one thing standing between me and the career I wanted.</p>
<h2>Why This Mattered</h2>
<p>The goal wasn't just to track problems. It was to build a system that would help me actually get better, not just feel busy.</p>
<p>Before CodeMaster, I would solve a problem, feel good about it, and then completely forget the solution two weeks later. I needed a system that would force me to revisit problems at the right intervals—not so soon that I was just memorizing, but not so late that I'd forgotten everything.</p>
<p>That's what spaced repetition does. It's not just tracking—it's actively reinforcing what you've learned at the exact moment your brain is about to forget it.</p>
<h2>What You Work On Matters</h2>
<p>What do you do for work? Most people answer with their profession or a job they're currently working, like it's the all-encompassing answer. The question is answered as if it's the only work that matters.</p>
<p>The economic pressure of life decides what work we take on based on how much money we can make and how painful the work is to complete.</p>
<p>But I decided in 2022 to take the other work I do in my life seriously. What that means is acknowledging and taking seriously my own aspirations and goals.</p>
<p>I can't force my success in the world. And while I have monetary goals, if I am able to prioritize my own work, my own creations, money will follow.</p>
<p>CodeMaster isn't just a portfolio project. It's proof that I can identify a problem, build a solution, and ship something real.</p>
<p>And that's why I didn't build another todo app.</p>
<hr>
<p><strong>Next post: The Features That Make CodeMaster Work</strong></p>

      ]]></content>
    </entry>
	
    
    <entry>
      <title>Was Your Application Down on 10/20?</title>
      <link href="https://WorkandDeath.com/blog/Was-Your-Application-Down-on-10-20/"/>
      <updated>2025-10-21T00:00:00Z</updated>
      <id>https://WorkandDeath.com/blog/Was-Your-Application-Down-on-10-20/</id>
      <content type="html"><![CDATA[
        <p>On Monday, October 20th, I couldn't open my VDI for work. It only lasted about 20 minutes, but at the same time, I noticed that Starbucks mobile ordering and Toast — a popular restaurant ordering platform — were both down for several hours.</p>
<p>Amazon Web Services (AWS) has roughly 40 percent of the cloud infrastructure market, so when a major outage happens, it naturally cascades across hundreds of companies and millions of users. But it made me wonder: whose fault is it when something like this happens — AWS or the developers who build on top of it?</p>
<p>The outage itself was isolated to AWS's US-EAST-1 region (Northern Virginia), yet so many applications across the country went offline. Shouldn't there be failovers or backup systems to handle that? What actually failed was AWS's internal DNS system, which connects core services like DynamoDB, EC2, and CloudWatch. When those DNS lookups broke, any application trying to reach those services simply couldn't — causing a ripple effect that spread far beyond one data center.</p>
<p>The reality is that while multi-region redundancy and backups are possible, they're also expensive. Running mirrored infrastructure in multiple data centers can easily increase monthly cloud costs by 50–200%, depending on the service and amount of data replication. For a smaller SaaS company spending $10,000 a month on AWS, that could mean $15,000–$25,000 or more — often not worth it for protection against a once-a-year outage.</p>
<p>For most businesses, the cost of full redundancy isn't worth the potential risk of a few hours of downtime once or twice a year. Instead, outages like these become a built-in part of the risk model — an accepted trade-off between uptime and operating cost.</p>
<p>My own VDI likely runs on a high-compute, multi-region setup, possibly through a provider like Citrix, which distributes workloads across multiple clouds or geographic zones. When routing failed for those 20 minutes, it probably just switched over to another data center automatically.</p>
<p>That's the difference between my VDI and many consumer apps: Citrix and similar enterprise systems are designed with multi-region active-active deployments, meaning they can keep running even if one region fails. But smaller companies can still hedge with cheaper strategies like multi-AZ deployments, caching, queued writes, or static fallback pages — ways to stay partially functional without doubling their infrastructure bill.</p>
<p>AWS outages like this aren't new. The 2017 S3 outage, the 2021 Kinesis failure, and the 2023 EC2 disruption all originated in the same US-EAST-1 region. Each time, it shows how much of the internet depends on a single point of failure.</p>
<p>Sometimes, it's not that companies don't know how to prevent downtime — it's that they simply can't justify the cost of being invincible.</p>

      ]]></content>
    </entry>
	
    
    <entry>
      <title>How I Finally Finished My First Real App (and Felt Like a Developer Again)</title>
      <link href="https://WorkandDeath.com/blog/How-I-Finally-Finished-My-First-Real-App-and-Felt-Like-a-Developer-Again/"/>
      <updated>2025-10-16T00:00:00Z</updated>
      <id>https://WorkandDeath.com/blog/How-I-Finally-Finished-My-First-Real-App-and-Felt-Like-a-Developer-Again/</id>
      <content type="html"><![CDATA[
        <h2>Why I Finally Finished</h2>
<p>CodeMaster took me embarrassingly long to finish—years, in fact. The only reason it didn't take me longer is? AI.</p>
<p>AI has empowered people to chase their dreams. I'm one of them.  I suddenly had access to all the answers I used to get stuck on. I already had two years of coding experience. People less skilled than me were using AI to ship applications. Why shouldn't I?</p>
<p>What was stopping me before was my lack of knowledge—I'd never built an app from scratch. But AI platformd like ChatGPT and Claude had all the knowledge of how to make applications successful. I used all the tools at my disposal because I decided: if I don't make this, if I don't finish it, no one will.</p>
<h2>Where I Was Coming From</h2>
<p>But to understand why CodeMaster mattered, you need to know where I was coming from.</p>
<p>I started coding in 2018 after an economics degree. I didn't know what path to take. This was during the coding bootcamp boom, and I got into a program for career changers—a chance to participate in a bootcamp and potentially get hired by their corporate sponsor.</p>
<p>At the end of the bootcamp, we had to present a full Angular application with a REST API. The bootcamp was Java-focused. We learned the basics and then had to demonstrate our skills. I struggled and didn't finish the project, but had to present what I had. They were not impressed, and I didn't get the position.</p>
<p>I still decided to apply to software development positions. I got a position but shorty after  COVID broke our, and the project I got hired for was canceled. I worked the next two years in a software development role where I wasn't doing much development. I would get some tasks like fixing a React form or hooking up a new endpoint to our UI. But 75% of the work was data scraping and validation—not real coding. I kind of checked out. I wasn't an active participant in my own career.</p>
<p>Eventually, I ended up in a help desk position. That's when I realized I had to build something of my own.</p>
<h2>The Realization</h2>
<p>I started applying for jobs but wouldn't hear back. Sometimes on applications you'll have an option to put your GitHub profile or portfolio. My GitHub wasn't consistent, and I had nothing in my portfolio. I wanted a well-paying job in my chosen field, and I wasn't doing everything to make that possible.</p>
<p>I thought about contributing to open-source projects. I completed 2 pull requests before realizing I didn't care about the projects I was working on. I was already selling 40 hours of my time working for money. I didn't want to exploit more of my time on work that didn't matter to me. I had a folder full of half-completed projects. I already had basic skills. I didn't need to follow another tutorial. I needed to build an application I cared about.</p>
<p>In my mind, having one app with real users on the Chrome Store would be worth more than all my half-finished projects. I could improve my GitHub profile through commits, and I would get proof for job applications and also for myself.</p>
<p>I needed a job, but more than that, I needed proof.</p>
<h2>Building CodeMaster</h2>
<p>That's when I decided to build CodeMaster—a Chrome extension that helps developers master data structures and algorithms through spaced repetition and pattern-based learning. It integrates directly with LeetCode, adapting to your progress and reinforcing what you've learned.</p>
<p>But more than the product, what changed was me. For the first time, I wasn't giving up halfway.</p>
<p>That daily effort—showing up and working toward something that mattered to me—started to change things. I've always had high aspirations, just like a lot of people out there. I think the main difference between people who accomplish their dreams and the people who don't is that they don't run from the work.</p>
<h2>What Changed</h2>
<p>CodeMaster is 95% done. I'm fixing the final bugs before launching on October 30th. For the first time, I'm not abandoning a project halfway. That alone has changed how I see myself—as a developer again.</p>
<p>And it helped me feel like a developer again.</p>
<p>In the next few posts, I'll share what I learned from shipping CodeMaster—from how I used AI to accelerate development to the lessons that finally helped me finish.</p>

      ]]></content>
    </entry>
	
</feed>