<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Josh Lawson</title>
    <description>The latest articles on Forem by Josh Lawson (@joshlawson100).</description>
    <link>https://forem.com/joshlawson100</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1685895%2Facf3b044-2456-4451-be41-bb89161dcfd6.png</url>
      <title>Forem: Josh Lawson</title>
      <link>https://forem.com/joshlawson100</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/joshlawson100"/>
    <language>en</language>
    <item>
      <title>Stop Using `console.log` — These Debugging Tricks Will Blow Your Mind</title>
      <dc:creator>Josh Lawson</dc:creator>
      <pubDate>Wed, 21 May 2025 22:08:38 +0000</pubDate>
      <link>https://forem.com/joshlawson100/stop-using-consolelog-these-debugging-tricks-will-blow-your-mind-436f</link>
      <guid>https://forem.com/joshlawson100/stop-using-consolelog-these-debugging-tricks-will-blow-your-mind-436f</guid>
      <description>&lt;p&gt;Let’s face it: &lt;code&gt;console.log&lt;/code&gt; is the comfort food of debugging. It’s quick, familiar, and kind of satisfying in that junk-food sort of way. But if you've ever buried your terminal in a jungle of &lt;code&gt;console.log("HERE")&lt;/code&gt;, &lt;code&gt;console.log("THERE")&lt;/code&gt;, and the classic &lt;code&gt;console.log("WTF is going on")&lt;/code&gt;, then you already know — it doesn’t scale.&lt;/p&gt;

&lt;p&gt;Here’s the thing: if you're building real software (not just tinkering on a rainy Sunday), you need sharper tools. Tools that let you see what's happening under the hood without littering your codebase with digital breadcrumbs.&lt;/p&gt;

&lt;p&gt;So yeah, it’s time to break up with &lt;code&gt;console.log&lt;/code&gt;. But don’t worry — I’m not gonna leave you hanging. Let’s look at some smarter, dare I say, mind-blowing ways to debug your code without turning your terminal into a cry for help.&lt;/p&gt;




&lt;h2&gt;
  
  
  But First… Why Do We Cling to &lt;code&gt;console.log&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Honestly? Because it works. It’s there. It’s easy. You don’t need to configure anything, and the feedback is immediate. It’s like that friend who gives you bad advice, but at least they answer your calls.&lt;/p&gt;

&lt;p&gt;The problem is — it doesn’t help you think. It doesn’t offer context. It’s noisy. It’s often too much or too little. And worst of all, it turns your code into a mess of cluttered print statements that never get cleaned up. (And yes, you &lt;em&gt;will&lt;/em&gt; forget one and push it to production.)&lt;/p&gt;

&lt;p&gt;So let’s talk about real tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;strong&gt;Set Breakpoints Like a Grown-Up (Seriously)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Debuggers aren’t just for Java or C++ elitists. In modern environments — think VS Code, Chrome DevTools, WebStorm — breakpoints are stupidly easy to use.&lt;/p&gt;

&lt;p&gt;Here's how this works in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open your file in VS Code.&lt;/li&gt;
&lt;li&gt;Click next to the line number. Boom — that’s a breakpoint.&lt;/li&gt;
&lt;li&gt;Run your app in debug mode.&lt;/li&gt;
&lt;li&gt;Execution &lt;em&gt;stops&lt;/em&gt; right there. You can hover over variables, peek into scopes, even change values on the fly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s like hitting “pause” on your code mid-movie. Want to see what &lt;code&gt;user.isLoggedIn&lt;/code&gt; actually contains right there? Done. No need to type &lt;code&gt;console.log('isLoggedIn:', user.isLoggedIn)&lt;/code&gt; five lines in a row.&lt;/p&gt;

&lt;p&gt;And if you’re in the browser? Same deal. Open Chrome DevTools → Sources tab → click the line number. You're in.&lt;/p&gt;

&lt;p&gt;Honestly, once you start using breakpoints properly, going back to &lt;code&gt;console.log&lt;/code&gt; feels like debugging with a blindfold and a stick.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. &lt;strong&gt;Watch Expressions (a.k.a. X-Ray Vision for Variables)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Imagine if you could track a variable’s value as your code runs — &lt;em&gt;without&lt;/em&gt; manually logging it every time it changes.&lt;/p&gt;

&lt;p&gt;That’s what &lt;em&gt;watch expressions&lt;/em&gt; do.&lt;/p&gt;

&lt;p&gt;In your debugger panel (again, VS Code or Chrome DevTools), there’s usually a section called &lt;strong&gt;Watch&lt;/strong&gt;. Add a variable name, like &lt;code&gt;cart.total&lt;/code&gt; or &lt;code&gt;this.state.user&lt;/code&gt;. Now, every time you hit a breakpoint, you get an updated snapshot of its current value — no print statements, no noise, just insight.&lt;/p&gt;

&lt;p&gt;Bonus tip? You can even write little expressions like &lt;code&gt;userList.filter(u =&amp;gt; u.isAdmin)&lt;/code&gt; — and it’ll evaluate them live.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;console.log&lt;/code&gt; is a flashlight in the dark, watch expressions are night-vision goggles.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;strong&gt;Conditional Breakpoints (a.k.a. “Only Stop When It’s Weird”)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here’s a scenario: you're in a loop that runs 1,000 times, and you only care about the 437th iteration when things blow up. You don’t want to slog through the first 436 steps, right?&lt;/p&gt;

&lt;p&gt;Just right-click on your breakpoint and set a &lt;strong&gt;condition&lt;/strong&gt; like &lt;code&gt;i === 437&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now your code runs &lt;em&gt;normally&lt;/em&gt; — until the exact moment something gets weird. You can even go fancier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isActive&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feels like cheating. It kind of is. Use it anyway.&lt;/p&gt;




&lt;h2&gt;
  
  
  Leverage the Power of &lt;code&gt;debugger;&lt;/code&gt; (Yup, It’s a Real Keyword)
&lt;/h2&gt;

&lt;p&gt;This one's criminally underused. If you're in JavaScript land, you can literally type &lt;code&gt;debugger;&lt;/code&gt; in your code. When DevTools is open, your app will pause there like you set a breakpoint — no clicking required.&lt;/p&gt;

&lt;p&gt;It’s like planting a trap in your code. Want to pause right inside an anonymous callback? Or deep in a dynamic component? Drop a &lt;code&gt;debugger;&lt;/code&gt; and let it stop on its own terms.&lt;/p&gt;

&lt;p&gt;Just — and I’m begging you here — don’t leave it in your commits. 🙃&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Network Tab Is Your Best Friend
&lt;/h2&gt;

&lt;p&gt;Raise your hand if you've ever tried to debug a bug that wasn't yours.&lt;/p&gt;

&lt;p&gt;You’re calling some API. It returns… something. Maybe. Or it fails mysteriously. Or the payload is missing one tiny field that throws everything off.&lt;/p&gt;

&lt;p&gt;Stop guessing. Just hit Network in your browser's DevTools.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can see the full request and response.&lt;/li&gt;
&lt;li&gt;Headers, payload, status codes.&lt;/li&gt;
&lt;li&gt;Even how long it took.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s like calling the restaurant and asking, “Hey, what did you &lt;em&gt;actually&lt;/em&gt; put in my order?” Then they send you the receipt and a recording of the kitchen.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Step Through Code Like Sherlock Holmes
&lt;/h2&gt;

&lt;p&gt;Instead of logging ten things in a row, how about just… walking through the code?&lt;/p&gt;

&lt;p&gt;Use Step Over, Step Into, and Step Out in your debugger to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move one line at a time (&lt;code&gt;Step Over&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Jump inside a function call (&lt;code&gt;Step Into&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Bail out of that function (&lt;code&gt;Step Out&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s like flipping pages in a mystery novel — but you’re also the detective.&lt;/p&gt;

&lt;p&gt;Once you get used to stepping through functions, you’ll catch weird async bugs, silent fails, and logic errors that logs just can’t show you.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Use Logging Libraries (If You Must Log)
&lt;/h2&gt;

&lt;p&gt;Okay, okay. Sometimes you &lt;em&gt;need&lt;/em&gt; to log.&lt;/p&gt;

&lt;p&gt;But at least do it with style. Use libraries like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/debug" rel="noopener noreferrer"&gt;debug&lt;/a&gt;: Enables you to toggle logs by namespace (e.g. &lt;code&gt;DEBUG=auth:* node app.js&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/winston" rel="noopener noreferrer"&gt;winston&lt;/a&gt;: For serious, production-level logging with levels, formats, and transports.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.npmjs.com/package/pino" rel="noopener noreferrer"&gt;pino&lt;/a&gt;: Ridiculously fast logger for Node.js apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tools make logs meaningful. You get timestamps, categories, and the ability to turn logs on or off without editing your code.&lt;/p&gt;

&lt;p&gt;Think of it like upgrading from Post-It notes to a whiteboard wall with color-coded markers.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Embrace Time Travel Debugging (Yes, That’s a Thing)
&lt;/h2&gt;

&lt;p&gt;Instead of this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Something broke&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Try this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Something broke&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It prints a full stack trace — so you see where that line was called, and who called it before that.&lt;/p&gt;

&lt;p&gt;Especially handy when dealing with callbacks, async flows, or when your app feels like a spaghetti monster with 14 limbs and no memory.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Stop Blaming Yourself — Use Linters and Type Systems
&lt;/h2&gt;

&lt;p&gt;Let’s be real: not every bug is a logic bug. Sometimes, it’s a typo. Or a missing prop. Or an undefined variable that only crashes under specific conditions.&lt;/p&gt;

&lt;p&gt;You shouldn’t have to debug those. That’s what static analysis is for.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;TypeScript&lt;/strong&gt; to catch type mismatches before you run anything.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;ESLint&lt;/strong&gt; with solid rule sets to catch sneaky mistakes (like unused vars, unreachable code, or accidentally shadowed variables).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Less time debugging dumb stuff means more time fixing real stuff.&lt;/p&gt;




&lt;h3&gt;
  
  
  Final Thought: Tools Don’t Make You Lazy — They Make You Smart
&lt;/h3&gt;

&lt;p&gt;There’s this weird macho culture in dev sometimes — like if you’re not suffering, you’re not doing it right. Forget that.&lt;/p&gt;

&lt;p&gt;The best developers aren’t the ones who suffer through a thousand logs to track a bug — they’re the ones who build tools, understand systems, and use every trick at their disposal to get the job done &lt;em&gt;faster&lt;/em&gt; and &lt;em&gt;better&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;You don’t get a gold star for sticking to &lt;code&gt;console.log&lt;/code&gt;. You get clean code, saved time, and fewer headaches by working &lt;em&gt;with&lt;/em&gt; the tools, not against them.&lt;/p&gt;

&lt;p&gt;So go ahead — delete those logs. Set a breakpoint. Watch your variables like a hawk. Debug like you actually like your job.&lt;/p&gt;

&lt;p&gt;Because you know what? You probably do.&lt;/p&gt;

&lt;p&gt;- Josh&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>beginners</category>
      <category>typescript</category>
    </item>
    <item>
      <title>The One Thing Nobody Tells You About Learning to Code</title>
      <dc:creator>Josh Lawson</dc:creator>
      <pubDate>Wed, 21 May 2025 06:17:45 +0000</pubDate>
      <link>https://forem.com/joshlawson100/the-one-thing-nobody-tells-you-about-learning-to-code-447j</link>
      <guid>https://forem.com/joshlawson100/the-one-thing-nobody-tells-you-about-learning-to-code-447j</guid>
      <description>&lt;p&gt;You hear a lot when you're learning to code.  &lt;/p&gt;

&lt;p&gt;"Start with Python!"&lt;br&gt;&lt;br&gt;
"Just build projects!"&lt;br&gt;&lt;br&gt;
"GitHub is your portfolio!"  &lt;/p&gt;

&lt;p&gt;Fair enough. But there's one thing almost nobody mentions—one truth that sneaks up on every developer, whether you're hacking on your first HTML button or shipping production-grade microservices at a SaaS startup.&lt;/p&gt;

&lt;p&gt;It’s this: &lt;strong&gt;learning to code isn’t really about code.&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Yeah, weirdly enough—it’s about &lt;em&gt;learning how to be wrong&lt;/em&gt; over and over... and not letting that wreck you.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup: When Code Breaks You (and How That’s the Point)
&lt;/h2&gt;

&lt;p&gt;There’s a particular kind of despair that only a broken build at 2:13 AM can give you.&lt;/p&gt;

&lt;p&gt;You’re staring at a terminal. The error message mocks you—&lt;code&gt;undefined is not a function&lt;/code&gt;. You’ve seen it fifteen times. You’ve checked the docs, double-checked Stack Overflow, even asked ChatGPT twice (guilty)—and still, nada.&lt;/p&gt;

&lt;p&gt;This is the moment that no tutorial really prepares you for. Not the syntax, not the logic. &lt;strong&gt;It’s the psychological slap&lt;/strong&gt;—that subtle hum of &lt;em&gt;“maybe I’m just not smart enough for this”&lt;/em&gt; creeping in.&lt;/p&gt;

&lt;p&gt;But here’s the thing:&lt;br&gt;&lt;br&gt;
That voice? It’s lying.&lt;/p&gt;




&lt;h2&gt;
  
  
  Code Is Basically the Gym for Your Brain’s Ego
&lt;/h2&gt;

&lt;p&gt;When you first start learning to code, you expect it to feel like learning a new tool. Something linear. Like picking up a hammer and gradually getting better at hitting nails.&lt;/p&gt;

&lt;p&gt;But coding is more like learning to juggle knives. While riding a unicycle. In traffic.&lt;br&gt;&lt;br&gt;
You think you’re grasping it, and then—bam! Segmentation fault.&lt;br&gt;&lt;br&gt;
You fix one bug and three more show up like some cursed Hydra.&lt;/p&gt;

&lt;p&gt;Here’s the kicker: &lt;strong&gt;that’s actually how you learn.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You don’t get better because you wrote perfect code. You get better because you wrote garbage, panicked a little, and then figured it out anyway.&lt;/p&gt;

&lt;p&gt;It’s less about code and more about emotional stamina.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let’s Talk About Shame (Briefly)
&lt;/h2&gt;

&lt;p&gt;Nobody tells you how much shame is baked into this process.&lt;br&gt;&lt;br&gt;
You’ll feel stupid asking a question that got answered on Reddit in 2011.&lt;br&gt;&lt;br&gt;
You’ll copy-paste something from Stack Overflow that works but makes zero sense.&lt;br&gt;&lt;br&gt;
You’ll write code that you &lt;em&gt;know&lt;/em&gt; is a duct-taped horror show but hey—it works. Sort of.&lt;/p&gt;

&lt;p&gt;And that’s okay.&lt;/p&gt;

&lt;p&gt;You know why? Because the people you look up to?&lt;br&gt;&lt;br&gt;
They’ve done the same stuff. They’ve written worse. They’ve Googled “javascript array remove item” like, 900 times.&lt;/p&gt;

&lt;p&gt;The difference is—they kept going. They didn’t take that feeling of “I suck at this” and make it their identity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Debugging Yourself Is Part of the Job
&lt;/h2&gt;

&lt;p&gt;Here’s a fun paradox: you’ll spend more time debugging than writing “real” code.&lt;br&gt;&lt;br&gt;
In fact, debugging &lt;em&gt;is&lt;/em&gt; real code.&lt;/p&gt;

&lt;p&gt;If you're building a SaaS dashboard and the data won’t load—congrats, you’ve just entered the real dev grind. It's not about building slick features. It’s about making things &lt;em&gt;work&lt;/em&gt; when they absolutely don’t want to.&lt;/p&gt;

&lt;p&gt;You learn to trace logic like a detective chasing a criminal with a three-second head start. You learn to follow the clues: that stray &lt;code&gt;null&lt;/code&gt;, that off-by-one index, that one environment variable you misspelled three hours ago.&lt;/p&gt;

&lt;p&gt;It’s a game of mental hide-and-seek. And yeah, sometimes it’s brutal. But solving it? &lt;em&gt;Electric.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You find that one missing semicolon, refresh the browser, and suddenly—it works. And it feels like magic.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Myth of "Just Build Stuff"
&lt;/h2&gt;

&lt;p&gt;You hear this a lot: &lt;em&gt;“Don’t overthink it—just build stuff!”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That’s great advice. But also kind of misleading.&lt;/p&gt;

&lt;p&gt;Because &lt;em&gt;building stuff&lt;/em&gt; implies that you know what you’re building and how it’ll all come together. More often, you’re cobbling together half-baked tutorials, React components you don’t fully understand, and a mess of config files from some Medium article written in 2019.&lt;/p&gt;

&lt;p&gt;What they really mean is:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Just struggle through making stuff.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
And learn to be okay with feeling like a mess for a while.&lt;/p&gt;

&lt;p&gt;Building is how you discover what you &lt;em&gt;don’t&lt;/em&gt; know. That’s when it starts to click—not when you're comfortable, but when you're completely confused and &lt;em&gt;keep going anyway&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Meet the Emotional Dev Stack
&lt;/h2&gt;

&lt;p&gt;We talk a lot about tech stacks: MERN, LAMP, JAMStack, whatever.&lt;/p&gt;

&lt;p&gt;But there's a stack nobody talks about, and it's the one that &lt;em&gt;actually&lt;/em&gt; carries you through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frustration.js&lt;/strong&gt; – Because 90% of the time, something isn’t working and you’re not sure why.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistence.css&lt;/strong&gt; – You’ll need to style your attitude with a heavy dose of “try again.”
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CuriosityAPI&lt;/strong&gt; – A healthy hunger for “what does this thing actually &lt;em&gt;do&lt;/em&gt;?”
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HumilityDB&lt;/strong&gt; – Because you will be wrong. A lot. Document it, learn from it.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CommunityAuth&lt;/strong&gt; – You will need people. Don’t gatekeep yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This emotional stack is the real foundation. Without it, no amount of frameworks or syntax tricks will matter. With it, you’ll keep growing even when it feels like you’re stuck.&lt;/p&gt;




&lt;h2&gt;
  
  
  You’ll Never Really “Arrive”—And That’s Weirdly Beautiful
&lt;/h2&gt;

&lt;p&gt;One of the weirdest things about learning to code is that there’s no actual finish line.&lt;/p&gt;

&lt;p&gt;Even senior devs Google stuff daily.&lt;br&gt;&lt;br&gt;
Even people working at Stripe, GitHub, or Vercel break things regularly.&lt;br&gt;&lt;br&gt;
The difference is, they’ve built a tolerance for the chaos.&lt;/p&gt;

&lt;p&gt;So if you’re waiting for that moment when you &lt;em&gt;feel&lt;/em&gt; like a “real developer”?&lt;br&gt;&lt;br&gt;
Spoiler alert: you might already be one.&lt;br&gt;&lt;br&gt;
The fact that you’re struggling, questioning, fixing, building—that &lt;em&gt;is&lt;/em&gt; the job.&lt;/p&gt;

&lt;p&gt;It’s not about knowing everything. It’s about staying curious, humble, and a little stubborn.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Talk: You’re Gonna Suck… And Then Be Awesome
&lt;/h2&gt;

&lt;p&gt;It’s honestly kind of wild how bad you’ll be at first.&lt;br&gt;&lt;br&gt;
That’s not an insult—it’s just math.&lt;/p&gt;

&lt;p&gt;Nobody builds perfect things from day one. That landing page? Clunky. That JavaScript logic? Leaky. That database schema? Probably cursed.&lt;/p&gt;

&lt;p&gt;But eventually, it all starts feeling &lt;em&gt;less hard&lt;/em&gt;. You start recognizing patterns. You build mental models. You &lt;em&gt;start to see&lt;/em&gt; the matrix, even if it’s glitchy.&lt;/p&gt;

&lt;p&gt;Then—something weird happens.&lt;br&gt;&lt;br&gt;
You help someone else.&lt;br&gt;&lt;br&gt;
You explain a concept.&lt;br&gt;&lt;br&gt;
You clean up your old code and actually feel proud.&lt;/p&gt;

&lt;p&gt;That’s the quiet arrival. The one nobody announces. But it’s real.&lt;/p&gt;




&lt;h2&gt;
  
  
  So What’s the One Thing?
&lt;/h2&gt;

&lt;p&gt;If you’ve read this far, maybe you’ve guessed it already:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning to code is more about managing your own doubt than mastering the tech.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You’ll get the syntax. The logic will come. You’ll memorize weird API names and start slinging regex like it’s no big deal.&lt;/p&gt;

&lt;p&gt;But the real game?&lt;br&gt;&lt;br&gt;
It’s sticking with it when it’s ugly, confusing, or straight-up demoralizing.&lt;/p&gt;

&lt;p&gt;Every dev you admire? They’ve felt exactly what you’re feeling.&lt;br&gt;&lt;br&gt;
They just didn’t stop.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought: Keep Breaking Stuff
&lt;/h2&gt;

&lt;p&gt;Honestly, the best advice I can give?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Break stuff. A lot.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Mess up that repo. Push broken code. Forget semicolons. Try something totally wrong and see what happens.&lt;/p&gt;

&lt;p&gt;Because &lt;em&gt;that’s&lt;/em&gt; how it sticks.&lt;/p&gt;

&lt;p&gt;You’re not failing. You’re collecting war stories.&lt;br&gt;&lt;br&gt;
And trust me—every good dev’s got a few.&lt;/p&gt;

&lt;p&gt;So go ahead. Get frustrated. Ask the “dumb” question. Write terrible code.&lt;br&gt;&lt;br&gt;
Then write slightly less terrible code.  &lt;/p&gt;

&lt;p&gt;And one day, you’ll look back and think,&lt;br&gt;&lt;br&gt;
“Wow—I really didn’t know what I was doing.”&lt;br&gt;&lt;br&gt;
But you’ll smile. Because now you kinda do.&lt;/p&gt;

&lt;p&gt;- Josh&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Why Your Side Project Will Fail (And Why That’s Totally Fine)</title>
      <dc:creator>Josh Lawson</dc:creator>
      <pubDate>Tue, 20 May 2025 06:38:39 +0000</pubDate>
      <link>https://forem.com/joshlawson100/why-your-side-project-will-fail-and-why-thats-totally-fine-1m6a</link>
      <guid>https://forem.com/joshlawson100/why-your-side-project-will-fail-and-why-thats-totally-fine-1m6a</guid>
      <description>&lt;p&gt;So you’ve started a side project.&lt;/p&gt;

&lt;p&gt;You bought the domain, spun up a repo, maybe even slapped together a landing page. You're pumped. This is &lt;em&gt;it&lt;/em&gt;. The idea that's going to finally lift you out of your day job (which you only kind of hate) and into indie hacker stardom.&lt;/p&gt;

&lt;p&gt;But here’s the uncomfortable truth:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;It’s probably going to fail.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not because you’re lazy. Not because your code is trash. And definitely not because you lack vision.&lt;/p&gt;

&lt;p&gt;It’s just... how this works.&lt;/p&gt;

&lt;p&gt;Let me explain.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Statistics Suck. But That’s Not the Point.
&lt;/h2&gt;

&lt;p&gt;The numbers? They’re brutal. Something like 90% of side projects go nowhere. They fizzle out in silence—one dusty commit at a time.&lt;/p&gt;

&lt;p&gt;But if you’ve been around devs, you already know this. You've seen dozens of "Coming Soon" pages that never... well, came.&lt;/p&gt;

&lt;p&gt;And yet, people &lt;em&gt;still&lt;/em&gt; start new projects. They &lt;em&gt;still&lt;/em&gt; stay up till 2 a.m. fiddling with Next.js animations or writing API docs no one will ever read. Why?&lt;/p&gt;

&lt;p&gt;Because even if your project fails, &lt;strong&gt;you win&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We’ll get to that. First, let’s talk about why these things fall apart.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Motivation Mirage
&lt;/h2&gt;

&lt;p&gt;The first week? You're unstoppable. You're sketching wireframes during lunch breaks and tweaking typography at red lights. (Don't do that.)&lt;/p&gt;

&lt;p&gt;But then, something shifts. Your enthusiasm turns into obligation. The dopamine rush dries up. You hit something mundane—billing logic or GDPR compliance—and suddenly, Netflix looks really inviting.&lt;/p&gt;

&lt;p&gt;Motivation is like a sugar high. It hits fast, feels amazing, and then drops you on your face.&lt;/p&gt;

&lt;p&gt;Sustainable side projects aren’t built on motivation. They’re built on something far grittier: &lt;strong&gt;habit, purpose, and occasionally, pure spite.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Too Many Hats, Not Enough Heads
&lt;/h2&gt;

&lt;p&gt;Building a side project is like running a tiny, underfunded, chaotic startup—except you’re the CEO, CTO, CMO, and the intern. You’re doing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend and backend&lt;/li&gt;
&lt;li&gt;Copywriting (which you swear you’re terrible at)&lt;/li&gt;
&lt;li&gt;DevOps you barely understand&lt;/li&gt;
&lt;li&gt;And somehow, customer support for that one guy in Bulgaria who emailed you at 3 a.m.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unless you’re a polymath or sleep four hours a night (and I don't recommend it), you’re going to drop balls. And guess what? That’s completely normal.&lt;/p&gt;

&lt;p&gt;The truth? Most developers underestimate how much &lt;em&gt;non-coding&lt;/em&gt; work is involved. And when the actual building stops being fun, the whole thing screeches to a halt.&lt;/p&gt;




&lt;h2&gt;
  
  
  Shiny Object Syndrome Is Real
&lt;/h2&gt;

&lt;p&gt;There’s always another idea.&lt;/p&gt;

&lt;p&gt;You're deep in a project—weeks of code written, issues logged, a semi-functional MVP online—and then someone on Hacker News posts a cool new library. Or you wake up with a “better” idea. Cleaner. Simpler. Faster to ship.&lt;/p&gt;

&lt;p&gt;Suddenly, your current project feels clunky. Messy. Boring.&lt;/p&gt;

&lt;p&gt;So you start something new. Again.&lt;/p&gt;

&lt;p&gt;And again.&lt;/p&gt;

&lt;p&gt;Until your GitHub is littered with half-built empires, each one abandoned at the exact moment it stopped being fun.&lt;/p&gt;

&lt;p&gt;Side note: this doesn't make you flaky. It just means you're creative. But eventually, you’ll have to choose whether you’re chasing novelty or progress.&lt;/p&gt;




&lt;h2&gt;
  
  
  You’re Not Supposed to Know Everything
&lt;/h2&gt;

&lt;p&gt;One reason side projects stall? You hit something you &lt;em&gt;don’t know&lt;/em&gt; how to do.&lt;/p&gt;

&lt;p&gt;OAuth integrations. Pricing models. Writing actual terms and conditions.&lt;/p&gt;

&lt;p&gt;And instead of pushing through, you stop. Not because you’re incapable—but because it’s uncomfortable.&lt;/p&gt;

&lt;p&gt;We’re all a bit allergic to discomfort. Especially devs who are used to feeling in control.&lt;/p&gt;

&lt;p&gt;But here's the thing: &lt;em&gt;you don't need to master everything&lt;/em&gt;. You just need to be okay with not knowing stuff and figuring it out anyway.&lt;/p&gt;




&lt;h2&gt;
  
  
  Now for the Good News
&lt;/h2&gt;

&lt;p&gt;So yeah—your side project might flop. But let me flip this on its head.&lt;/p&gt;

&lt;p&gt;That failure? It's not failure at all. It’s disguised progress.&lt;/p&gt;

&lt;p&gt;Here’s why.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Every Project Levels You Up
&lt;/h3&gt;

&lt;p&gt;Even if no one uses your app, you &lt;em&gt;used&lt;/em&gt; it. You learned. You tried.&lt;/p&gt;

&lt;p&gt;You maybe figured out how to connect Stripe without crying, or got your first taste of AWS Lambda. Or maybe you finally understood why everyone complains about CSS.&lt;/p&gt;

&lt;p&gt;Each side project is like a gym session. Doesn’t matter if you win a competition—what matters is the reps.&lt;/p&gt;

&lt;p&gt;Your 4th failed app is &lt;em&gt;way&lt;/em&gt; better than your 1st failed app. And the 5th might just be the one that sticks.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. You’re Building a Personal Stack
&lt;/h3&gt;

&lt;p&gt;Not just tech-wise—although yeah, your stack probably evolved from jQuery to React to SvelteKit with a sprinkle of Tailwind somewhere in between.&lt;/p&gt;

&lt;p&gt;I’m talking about your &lt;em&gt;approach&lt;/em&gt;. Your decision-making. Your taste.&lt;/p&gt;

&lt;p&gt;You learn what &lt;em&gt;not&lt;/em&gt; to build. You stop overengineering. You start writing copy that doesn’t sound like it came from an AI with a thesaurus addiction.&lt;/p&gt;

&lt;p&gt;In short: you get better at knowing what &lt;em&gt;actually matters&lt;/em&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Momentum Beats Perfection
&lt;/h3&gt;

&lt;p&gt;The people who eventually ship successful projects?&lt;/p&gt;

&lt;p&gt;They’re the ones who keep moving.&lt;/p&gt;

&lt;p&gt;Not because they’re smarter. Just because they don’t quit completely.&lt;/p&gt;

&lt;p&gt;They take breaks, sure. They ghost projects sometimes. But they always come back swinging—new repo, new idea, slightly less bad typography.&lt;/p&gt;

&lt;p&gt;And eventually, one of those projects sticks. Not because it was perfect. But because they just kept going.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. The Community Sees You (Even If You Don’t Notice)
&lt;/h3&gt;

&lt;p&gt;You might feel invisible. Like you’re shouting into the void on Twitter. But people notice.&lt;/p&gt;

&lt;p&gt;Your consistency. Your ideas. Your willingness to &lt;em&gt;build&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That stuff adds up.&lt;/p&gt;

&lt;p&gt;I’ve seen devs land jobs, collaborators, podcast invites, and newsletter subs &lt;em&gt;just&lt;/em&gt; because they kept posting about their side projects—even the janky ones.&lt;/p&gt;

&lt;p&gt;So don’t wait for the “perfect” project to show up. Just show up yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Okay, So… What Now?
&lt;/h2&gt;

&lt;p&gt;Let’s say you’re in the messy middle of a dying project right now. What should you do?&lt;/p&gt;

&lt;p&gt;Here’s a low-stress checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pause without quitting.&lt;/strong&gt; Step away. Breathe. You’re allowed to rest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Talk about it.&lt;/strong&gt; Even the messy stuff. Especially the messy stuff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set a tiny goal.&lt;/strong&gt; One bug fix. One tweet. One feature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get feedback.&lt;/strong&gt; Not from randos—ask people who get it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remember your why.&lt;/strong&gt; Reconnect with what made this project exciting &lt;em&gt;before&lt;/em&gt; it got hard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you decide to shelf it? That’s okay too. Just don’t burn out pretending to care.&lt;/p&gt;




&lt;h2&gt;
  
  
  You’re Not Wasting Your Time
&lt;/h2&gt;

&lt;p&gt;Look—I know it feels like you’re stuck in a loop sometimes. Starting projects, abandoning them, questioning if you’ll ever finish something worth sharing.&lt;/p&gt;

&lt;p&gt;But you &lt;em&gt;are&lt;/em&gt; moving forward.&lt;/p&gt;

&lt;p&gt;You’re collecting scars, stories, skills. Stuff that won’t show up in your GitHub green squares, but absolutely shows up in how you think, code, and create.&lt;/p&gt;

&lt;p&gt;The people who “make it”? They’re not better than you. They just kept swinging. Through the boring parts. Through the rewrites. Through the failed launches.&lt;/p&gt;

&lt;p&gt;So yeah—your side project might fail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But it’s still worth building.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;- Josh&lt;/p&gt;

</description>
      <category>programming</category>
      <category>saas</category>
      <category>startup</category>
      <category>webdev</category>
    </item>
    <item>
      <title>5 VS Code Extensions You Didn’t Know You Needed</title>
      <dc:creator>Josh Lawson</dc:creator>
      <pubDate>Thu, 15 May 2025 08:51:43 +0000</pubDate>
      <link>https://forem.com/joshlawson100/5-vs-code-extensions-you-didnt-know-you-needed-32d4</link>
      <guid>https://forem.com/joshlawson100/5-vs-code-extensions-you-didnt-know-you-needed-32d4</guid>
      <description>&lt;p&gt;So you think you’ve tricked out your VS Code setup? Maybe you’ve got Prettier auto-formatting like a digital housekeeper, or GitLens telling you exactly who to side-eye for that broken line of code. Cool, cool. But here’s the thing—there are a few under-the-radar extensions that aren’t just nice to have. They’re low-key life-changing. You might not even know you’re missing them, until you try them.&lt;/p&gt;

&lt;p&gt;This isn’t another laundry list of the &lt;em&gt;usual suspects&lt;/em&gt;. No shade to ESLint and Live Server, but let’s get into the stuff that flies under the radar—like that indie band you pretend you discovered before they blew up.&lt;/p&gt;

&lt;p&gt;Let’s talk about five VS Code extensions that just &lt;em&gt;quietly&lt;/em&gt; make everything better.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;strong&gt;Polacode – Because Screenshots Shouldn't Look Like Crime Scenes&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You ever try to share a snippet of code in Slack and it looks like you took a blurry picture of your monitor using a toaster? Not exactly portfolio material.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Polacode&lt;/strong&gt; fixes that. It turns your VS Code snippet into a gorgeous, Instagrammable Polaroid-style image. It respects your theme and fonts, and yeah—it’s silly. But you know what? It’s also &lt;em&gt;weirdly satisfying&lt;/em&gt;. Great for tweeting elegant solutions or sharing something you're irrationally proud of (like finally fixing a CSS issue that's been haunting you for three days).&lt;/p&gt;

&lt;p&gt;Use it once, and you'll catch yourself beautifying even the tiniest of code samples. It's like code scrapbooking. And don't act like you're above that.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. &lt;strong&gt;Error Lens – Because Red Squiggles Are Just the Beginning&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let’s be real: VS Code’s default error handling is about as helpful as a shrug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error Lens&lt;/strong&gt; doesn’t just underline your mistakes. It shouts them from the rooftops (but like, in a constructive way). Instead of vague red lines, you get inline messages that explain exactly what’s wrong—and where.&lt;/p&gt;

&lt;p&gt;No more hovering like a nervous wreck over a cryptic error icon. The issue is right there in your face, bold and unapologetic. If you've ever spent 20 minutes squinting at an unresolved import or a forgotten semicolon, Error Lens feels like having a very patient, very blunt friend sitting beside you.&lt;/p&gt;

&lt;p&gt;Also? It's oddly calming to just &lt;em&gt;know&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. &lt;strong&gt;Peacock – Because Sometimes Context is Everything&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Raise your hand if you’ve ever opened five VS Code windows and edited the wrong one. Yeah, me too. You think you're saving changes to your test environment, but nope—production is crying now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Peacock&lt;/strong&gt; lets you tint your VS Code workspace so you can instantly tell them apart. Maybe green for dev, red for prod (high-stakes vibe), and blue for that pet project you poke at during lunch breaks.&lt;/p&gt;

&lt;p&gt;It’s simple. Almost too simple. But it solves a problem that costs people real hours—and possibly their last nerve. You don’t realize how much mental load you're carrying until Peacock quietly takes that weight off.&lt;/p&gt;

&lt;p&gt;And hey, it feels kinda luxurious. Like putting your code editor in a tailored outfit.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. &lt;strong&gt;CodeSnap – Sharing Code Never Looked This Good&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Yeah, technically I already mentioned Polacode. But hear me out—&lt;strong&gt;CodeSnap&lt;/strong&gt; deserves its own shoutout.&lt;/p&gt;

&lt;p&gt;Why? Because it's the slightly more practical sibling. While Polacode is all about aesthetic vibes, CodeSnap keeps it clean and functional. It creates beautiful images of your code with zero fuss, and you can tweak padding, background, and theme support.&lt;/p&gt;

&lt;p&gt;Honestly, the choice between the two depends on your mood. Want drama? Go Polacode. Want clarity? CodeSnap’s your move.&lt;/p&gt;

&lt;p&gt;It’s also sneakily good for documentation and internal wikis. People &lt;em&gt;do&lt;/em&gt; read those, by the way—especially when they don’t look like ransom notes.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. &lt;strong&gt;TODO Highlight – Because Memory is a Lie&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You know that thing where you leave a &lt;code&gt;// TODO: Refactor this before Friday&lt;/code&gt; and then completely forget? It’s fine, we’ve all been there. Deadlines come and go, and suddenly your TODOs are like ghosts haunting your codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TODO Highlight&lt;/strong&gt; makes them pop out—literally. It adds visual flair (think neon highlighter) to your &lt;code&gt;TODO&lt;/code&gt;, &lt;code&gt;FIXME&lt;/code&gt;, and whatever other custom tags you like to use when future-you needs a reminder.&lt;/p&gt;

&lt;p&gt;You’ll spot them instantly when you scroll through your files. It’s like putting sticky notes in your code—except you can’t lose them under a coffee mug.&lt;/p&gt;

&lt;p&gt;Bonus tip: combine it with the “Bookmarks” extension and start navigating like a time traveler with a perfect memory. Because let’s face it, your brain deserves a break.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts: It’s Not About Bells and Whistles, It’s About Flow
&lt;/h2&gt;

&lt;p&gt;The best extensions don’t add flash—they remove friction.&lt;/p&gt;

&lt;p&gt;VS Code already does a ton. But these lesser-known tools quietly smooth out the edges of your workflow. They make code feel a bit more human, a bit more yours.&lt;/p&gt;

&lt;p&gt;And isn’t that the point? You’re not just building apps or APIs—you’re crafting something. Sometimes, the right tool can turn a frustrating hour into a focused sprint. Sometimes, it’s the thing that helps you stay &lt;em&gt;in flow&lt;/em&gt;, just a little longer.&lt;/p&gt;

&lt;p&gt;So maybe try one. Or all five. Worst case? You uninstall it. Best case? You wonder how you ever wrote code without it.&lt;/p&gt;

&lt;p&gt;And hey, if you’ve got a weird, wonderful extension that you swear by, don’t gatekeep—spread the word. The VS Code rabbit hole is deep, and honestly, that’s half the fun.&lt;/p&gt;

&lt;p&gt;- Josh&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; None of these are sponsored. Just sharing the love, one extension at a time.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A Beginner's Guide to Docker</title>
      <dc:creator>Josh Lawson</dc:creator>
      <pubDate>Wed, 14 May 2025 14:01:00 +0000</pubDate>
      <link>https://forem.com/joshlawson100/a-beginners-guide-to-docker-39p4</link>
      <guid>https://forem.com/joshlawson100/a-beginners-guide-to-docker-39p4</guid>
      <description>&lt;p&gt;If you’ve ever yelled at your computer because “it worked on my machine,” hey, welcome. You’re not alone. Every developer, from the bright-eyed intern to the CTO juggling a dozen microservices, has run headfirst into environment hell. And that’s where Docker walks in like the calm friend who actually knows how to fix things, not just complain about them.&lt;/p&gt;

&lt;p&gt;But what is Docker, really? Why is everyone talking about containers like we’ve all suddenly become digital lunch packers? And most importantly—how do you use it without spiralling into config-file-induced madness?&lt;/p&gt;

&lt;p&gt;Pull up a chair. We’re breaking Docker down piece by piece, without sounding like a DevOps textbook had a nervous breakdown.&lt;/p&gt;




&lt;h2&gt;
  
  
  So… What Exactly &lt;em&gt;Is&lt;/em&gt; Docker?
&lt;/h2&gt;

&lt;p&gt;Let’s start with a simple one-liner: Docker is a tool that lets you package up your application along with everything it needs to run—dependencies, system tools, settings—into something called a &lt;strong&gt;container&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of a container like a shipping container. It doesn’t care what’s inside—Python app, Node project, a tiny Go binary that could take over the world—it wraps it all up neatly, so you can ship it anywhere without worrying about what’s on the other side.&lt;/p&gt;

&lt;p&gt;No more “works on my machine” drama. No more weird bugs because someone had an older version of libxml installed. With Docker, you get consistency, plain and simple.&lt;/p&gt;




&lt;h2&gt;
  
  
  Containers vs. Virtual Machines: What's the Difference?
&lt;/h2&gt;

&lt;p&gt;Quick detour here—because folks get this part tangled up all the time.&lt;/p&gt;

&lt;p&gt;Containers aren’t VMs. They're &lt;strong&gt;lighter&lt;/strong&gt;, &lt;strong&gt;faster&lt;/strong&gt;, and &lt;strong&gt;don’t come with all the baggage&lt;/strong&gt;. Imagine a virtual machine like renting a whole apartment just to boil some pasta. You’ve got your own walls, plumbing, kitchen—even if you’re just using a single burner.&lt;/p&gt;

&lt;p&gt;Now, a container? That’s like sharing a kitchen in a co-working space. Everyone brings their own pan, their own spices, and just cooks their stuff—without needing an entire building.&lt;/p&gt;

&lt;p&gt;Docker uses the host machine’s kernel but isolates everything else. That makes containers super fast to start and way less resource-hungry.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installing Docker (Without the Tears)
&lt;/h2&gt;

&lt;p&gt;Let’s keep this part short because installing Docker shouldn’t be an ordeal—and thankfully, it isn’t.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mac &amp;amp; Windows
&lt;/h3&gt;

&lt;p&gt;You’ll want &lt;strong&gt;Docker Desktop&lt;/strong&gt;. Head to &lt;a href="https://www.docker.com/products/docker-desktop" rel="noopener noreferrer"&gt;https://www.docker.com/products/docker-desktop&lt;/a&gt;, download the version for your OS, and follow the installer. It’s GUI-based, so even if you’re allergic to the terminal, you’ll survive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linux
&lt;/h3&gt;

&lt;p&gt;You’ve got a few options depending on your distro, but for most Ubuntu folks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker.io
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And don’t forget to add yourself to the Docker group if you don’t want to use &lt;code&gt;sudo&lt;/code&gt; every time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Log out and back in—then you’re good to go.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let’s Build Your First Container (You Got This)
&lt;/h2&gt;

&lt;p&gt;Okay, let’s say you’ve got a small Python script—maybe a Flask app or something that just says "Hello, Docker!"&lt;/p&gt;

&lt;p&gt;Here’s the thing: You can run that inside a container without installing Python on your host. That’s the magic.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Your App
&lt;/h3&gt;

&lt;p&gt;Create a file called &lt;code&gt;app.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello from inside the container!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Your Dockerfile
&lt;/h3&gt;

&lt;p&gt;Now, create a &lt;code&gt;Dockerfile&lt;/code&gt; (no extension) in the same directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.13&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; app.py .&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python", "app.py"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells Docker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the official Python 3.13 image&lt;/li&gt;
&lt;li&gt;Copy your script into the container&lt;/li&gt;
&lt;li&gt;Run it with Python&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Build the Image
&lt;/h3&gt;

&lt;p&gt;From your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; hello-docker &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This packages everything into an image named &lt;code&gt;hello-docker&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Run It!
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run hello-docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And boom. You should see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello from inside the container!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. No Python installed locally. No setup scripts. Just your app, running clean.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Docker Commands You’ll Actually Use
&lt;/h2&gt;

&lt;p&gt;Docker has a bunch of commands—but you only need a few to get rolling.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker build -t &amp;lt;name&amp;gt; .&lt;/code&gt; — Build an image from your Dockerfile&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker run &amp;lt;name&amp;gt;&lt;/code&gt; — Start a container&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker ps&lt;/code&gt; — Show running containers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker stop &amp;lt;container_id&amp;gt;&lt;/code&gt; — Stop one&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker images&lt;/code&gt; — List all images&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker rmi &amp;lt;image_id&amp;gt;&lt;/code&gt; — Remove an image&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;docker exec -it &amp;lt;container_id&amp;gt; bash&lt;/code&gt; — Jump inside a container (like SSH)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll pick up more as you go, but these are your bread and butter.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Talk: Why Bother With Docker?
&lt;/h2&gt;

&lt;p&gt;You know what? Let’s pause here. Because this isn’t just about tools—it’s about sanity.&lt;/p&gt;

&lt;p&gt;Docker saves you from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;“it works for me”&lt;/code&gt; nightmare&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dependency hell (pip vs conda vs NPM vs...whatever Rust is doing)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Slow onboarding (give a new hire one command and they’re good)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Weird bugs that show up only in production&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also lets you simulate production environments, test your app in different setups, and—if you’re building for the cloud—Docker is practically a requirement. Kubernetes? CI/CD? Cloud functions? They all play nice with containers.&lt;/p&gt;




&lt;h2&gt;
  
  
  But Wait—Where Do Images Live?
&lt;/h2&gt;

&lt;p&gt;Just like code lives on GitHub, Docker images often live on Docker Hub (or private registries like GitHub Container Registry, Amazon ECR, etc.)&lt;/p&gt;

&lt;p&gt;Once you’ve built an image, you can push it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker tag hello-docker yourusername/hello-docker
docker push yourusername/hello-docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom—it’s now sharable, portable, and versioned like the rest of your stack.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Few Gotchas (Because Nothing’s Perfect)
&lt;/h2&gt;

&lt;p&gt;Okay, before we wrap, some friendly heads-ups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Volumes&lt;/em&gt; — Containers are ephemeral. If you need persistent data (like database files), you’ll want to mount volumes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Networking&lt;/em&gt; — Containers are isolated. If you’ve got multiple services talking to each other, you’ll need to configure Docker networks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Image Size&lt;/em&gt; — Some base images are huge. Look for &lt;code&gt;-slim&lt;/code&gt; versions or consider Alpine Linux for tiny builds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Build Context&lt;/em&gt; — Be careful with what you copy into your container. Don’t accidentally ship your &lt;code&gt;.env&lt;/code&gt; or &lt;code&gt;node_modules&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are dealbreakers—they're just the kind of stuff that bites when you’re not looking.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts (And a Bit of Tough Love)
&lt;/h2&gt;

&lt;p&gt;Look—Docker isn’t magic. It won’t fix bad code, poor planning, or your coffee addiction.&lt;/p&gt;

&lt;p&gt;But it will make your life a lot easier. It’s one of those tools that—once you’ve used it a few times—feels like cheating. You package your app, run it anywhere, and move on with your life. Clean. Consistent. Done.&lt;/p&gt;

&lt;p&gt;And sure, you’ll hit snags. Everyone does. But with a bit of tinkering and curiosity, Docker becomes second nature. Like git—but less terrifying (most of the time).&lt;/p&gt;

&lt;p&gt;So go ahead—containerize something small. Doesn’t matter what. A Flask app. A static site. Even a Node script that tells jokes. Just build it, run it, and see what happens.&lt;/p&gt;

&lt;p&gt;You’ll be surprised how much smoother everything starts to feel.&lt;/p&gt;




&lt;p&gt;Next up? Maybe orchestrating containers with Docker Compose. Or playing with Kubernetes. But for now—breathe. You’ve made it this far. And honestly? That’s already something to be proud of.&lt;/p&gt;

&lt;p&gt;- Josh&lt;/p&gt;

</description>
      <category>docker</category>
      <category>python</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>My Developer Stack in 2025: Fast, Fluid, and Frustratingly Fun</title>
      <dc:creator>Josh Lawson</dc:creator>
      <pubDate>Wed, 14 May 2025 07:27:41 +0000</pubDate>
      <link>https://forem.com/joshlawson100/my-developer-stack-in-2025-fast-fluid-and-frustratingly-fun-1g2b</link>
      <guid>https://forem.com/joshlawson100/my-developer-stack-in-2025-fast-fluid-and-frustratingly-fun-1g2b</guid>
      <description>&lt;p&gt;You ever stare at your codebase and think, &lt;em&gt;“Okay, this feels kinda… good?”&lt;/em&gt; Not perfect—never perfect—but there’s something oddly satisfying about seeing your stack come together. That’s been my 2025 vibe. I’ve dialled in a setup that’s fast, clean, expressive, and, most importantly, doesn’t make me want to scream into a pillow at 2 a.m. &lt;/p&gt;

&lt;p&gt;Let me break it down for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Frontend: Where I Spend &lt;em&gt;Way&lt;/em&gt; Too Much Time
&lt;/h2&gt;

&lt;p&gt;Okay, so frontend first. And yes, I know, backend folks are already rolling their eyes. But let’s be honest—we all judge apps by their UI before we even poke around the API.&lt;/p&gt;

&lt;p&gt;These days, I’m building almost everything with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Next.js&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shadcn/ui&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TailwindCSS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This trio has become my comfort zone, like a hoodie that actually fits right. Let’s unpack why.&lt;/p&gt;

&lt;h3&gt;
  
  
  Next.js: Not Just a React Wrapper Anymore
&lt;/h3&gt;

&lt;p&gt;Back when I first touched Next, it felt like React’s responsible older sibling—structured, opinionated, and maybe a little too into static generation. But 2025 Next? It’s evolved. I mean, with App Router, Server Actions, and built-in caching strategies, it’s the first time I’ve seen React apps behave like they belong in production &lt;em&gt;by default&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Plus, the DX (developer experience) is smoother than ever. Hot reloads don’t flake out like they used to. File-based routing still feels magical. And layouts finally make sense.&lt;/p&gt;

&lt;h3&gt;
  
  
  TailwindCSS: Utility-First, Brain-Later
&lt;/h3&gt;

&lt;p&gt;I’ll admit—I fought Tailwind at first. Something about adding &lt;code&gt;px-4 py-2&lt;/code&gt; to my button elements felt… wrong. Like I was breaking some kind of sacred separation-of-concerns law.&lt;/p&gt;

&lt;p&gt;But now? Now I get it.&lt;/p&gt;

&lt;p&gt;It’s fast. It’s readable. And with Just-in-Time mode, it’s blazing. No more custom classes unless I &lt;em&gt;absolutely&lt;/em&gt; need them. It’s become muscle memory.&lt;/p&gt;

&lt;p&gt;Also, if you haven’t paired Tailwind with Shadcn/ui yet, you’re sleeping.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shadcn/ui: Design System without the Handcuffs
&lt;/h3&gt;

&lt;p&gt;I used to dread building accessible, decent-looking components. Then I met Shadcn/ui. It’s not a library so much as a toolbox that lets you build &lt;em&gt;your&lt;/em&gt; UI—just with smarter defaults.&lt;/p&gt;

&lt;p&gt;Want to tweak that modal? Cool, it’s just code. No need to hack around somebody else’s abstraction. Shadcn lets you keep ownership of your components without starting from scratch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Supabase: My Backend Ride-or-Die
&lt;/h2&gt;

&lt;p&gt;Look, I’m not saying Supabase is perfect. But in 2025? It’s the closest thing I’ve found to a backend that “just works” without feeling like you sold your soul to a black-box platform.&lt;/p&gt;

&lt;p&gt;It gives me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Postgres&lt;/strong&gt; without the setup drama
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realtime&lt;/strong&gt; subscriptions that don’t randomly break (much)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Row-level security&lt;/strong&gt; that actually makes sense
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt; for user uploads that doesn’t make me cry
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the real kicker? &lt;strong&gt;Auth.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Supabase Auth: It’s Not a Headache Anymore
&lt;/h2&gt;

&lt;p&gt;You know what? For years, I dreaded building auth flows. Social login was finicky, email/password flows were security nightmares, and don’t even get me started on magic links.&lt;/p&gt;

&lt;p&gt;Supabase Auth fixed a lot of that. Built-in email/password? Check. OTPs and third-party providers? Yep. Session persistence? Actually reliable.&lt;/p&gt;

&lt;p&gt;The email templates still need a little love (okay, &lt;em&gt;a lot&lt;/em&gt;), but the rest of the flow is straightforward. Also, RLS + Auth integration means I don’t have to build custom guards everywhere. Just define my policies in SQL, and boom—my data protects itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Few Other Tools I Can’t Shut Up About
&lt;/h2&gt;

&lt;p&gt;Alright, so here’s the part where I sneak in some extras. Because yeah, frontend/backend/auth is the meat—but the garnish matters too.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zod&lt;/strong&gt; for schema validation. Catching bugs before they hit the DB is a small joy I treasure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tRPC&lt;/strong&gt; (yep, still alive and kicking) for typesafe APIs between my frontend and backend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; for deployments. It’s still magical—even when it breaks stuff. (Looking at you, edge functions.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve also been leaning into &lt;strong&gt;GitHub Copilot&lt;/strong&gt; more than I’d like to admit. It’s like pair programming with a semi-reliable ghost. Not perfect, but it gets me through boilerplate way faster.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stuff I’ve Dropped (and Why I Don’t Miss It)
&lt;/h2&gt;

&lt;p&gt;Let’s be real. You don’t fall in love with your stack without going through a few breakups. Here’s what I’ve cut loose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Firebase&lt;/strong&gt; — The vendor lock-in felt suffocating.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redux&lt;/strong&gt; — Honestly, I haven’t touched it in years. Zustand and context do more than enough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom UI kits&lt;/strong&gt; — Shadcn ruined me. I’m not going back.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes letting go is the best upgrade.&lt;/p&gt;




&lt;h2&gt;
  
  
  So... Why This Stack?
&lt;/h2&gt;

&lt;p&gt;It’s not flashy. It’s not trendy. But it’s mine.&lt;/p&gt;

&lt;p&gt;Every piece pulls its weight. Nothing feels overengineered or duct-taped together. And I can build apps—&lt;em&gt;real ones&lt;/em&gt;—in hours, not weeks. That’s the real win, right?&lt;/p&gt;

&lt;p&gt;I’ve had fewer meetings with myself about infrastructure and more actual building time. Which, ironically, means more time for debugging obscure edge cases and naming things badly—but I’ll take it.&lt;/p&gt;

&lt;p&gt;- Josh&lt;/p&gt;




&lt;h2&gt;
  
  
  One Last Thought (Because You’re Still Here)
&lt;/h2&gt;

&lt;p&gt;If you’re still reading this, thanks. Seriously. Writing about your stack is weirdly intimate. It’s like showing someone your desk—messy cables, half-finished Post-it notes, and all.&lt;/p&gt;

&lt;p&gt;But the point isn’t perfection. It’s momentum. It’s progress. It’s building stuff that works—and maybe even feels good to use.&lt;/p&gt;

&lt;p&gt;So, if you’re assembling your stack for 2025, don’t chase trends. (That feels contradictory now that I've written it.) Find the tools that feel like extensions of your hands. And when you do, don’t look back.&lt;/p&gt;

&lt;p&gt;Now excuse me while I push to production and pray nothing explodes.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Why your Tech Stack shouldn't change.</title>
      <dc:creator>Josh Lawson</dc:creator>
      <pubDate>Sat, 27 Jul 2024 04:05:38 +0000</pubDate>
      <link>https://forem.com/joshlawson100/why-your-tech-stack-shouldnt-change-51m1</link>
      <guid>https://forem.com/joshlawson100/why-your-tech-stack-shouldnt-change-51m1</guid>
      <description>&lt;p&gt;Technology is constantly changing. It honestly feels like there is a new JavaScript framework popping up EVERY SINGLE MONTH. But JavaScript frameworks aside, a key part of shipping SaaS faster is writing code faster.&lt;/p&gt;

&lt;p&gt;When I first learned to code, I was overwhelmed by the amount of languages I could choose from. Like thousands of others, I went down the rabbit hole of YouTube, trying to find the best programming language to learn. Fast forward a few years or so, and I've refined my Web Development tech stack into something so efficient that I can ship in under a week.&lt;/p&gt;

&lt;p&gt;This is the tech stack I'm using to develop &lt;a href="//www.cli-ck.dev"&gt;Cli.ck&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Front-end
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hokn57ig72buoeiw32n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hokn57ig72buoeiw32n.png" alt="I use DaisyUI as my component library." width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My entire tech stack is javaScript oriented.&lt;/p&gt;

&lt;p&gt;I use &lt;strong&gt;Next.js&lt;/strong&gt;, &lt;strong&gt;Tailwind&lt;/strong&gt;, and &lt;strong&gt;DaisyUI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;DaisyUI is an awesome tailwind component library I use to speed up development. It's got every single component under the sun, and comes with its own beautiful styling and 20+ colour themes.&lt;/p&gt;

&lt;p&gt;I've heard shadcn/ui is great, but haven't tried it yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Back-end
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzxz1yrrewsn3vo0n9br.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzxz1yrrewsn3vo0n9br.png" alt="Vercel's PostgreSQL databases are a great integration option." width="800" height="649"&gt;&lt;/a&gt;&lt;br&gt;
All my back-end computation is handled by &lt;strong&gt;Serverless Functions&lt;/strong&gt;. Next.js handles these really well, and it makes life 100x easier than writing API routes for everything.&lt;/p&gt;

&lt;p&gt;For storage I use &lt;strong&gt;Vercel's integrated PostgreSQL database&lt;/strong&gt;. You get a free one with their hobby plan so I would highly suggest checking it out. &lt;/p&gt;

&lt;p&gt;I also use &lt;strong&gt;Prisma&lt;/strong&gt; as my database ORM because I hate writing raw SQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hosting + Extras
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fray8c4y51mnhyvkvtscn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fray8c4y51mnhyvkvtscn.png" alt="Vercel is a great free place to host your website." width="800" height="539"&gt;&lt;/a&gt;&lt;br&gt;
All my websites are hosted with &lt;strong&gt;Vercel&lt;/strong&gt;. The same people who made Next.js also made Vercel, so it integrates nicely with my current stack. This is the main reason I use Vercel's PostgreSQL databases.&lt;/p&gt;

&lt;p&gt;I use &lt;strong&gt;Auth.js&lt;/strong&gt; for user authentication and user management, and &lt;strong&gt;Lemon Squeezy&lt;/strong&gt; for payments. &lt;/p&gt;

&lt;p&gt;All my emails are handled through &lt;strong&gt;Resend&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tech stacks don't matter&lt;/strong&gt;. What matters is how you use it. NASA sent men to the moon with a calculator (ok, not quite, but a computer with the same computational power), so it doesn't matter what languages/tools are in your tech stack.&lt;/p&gt;

&lt;p&gt;- Josh&lt;/p&gt;

&lt;p&gt;P.S: I'm currently developing my own SaaS, &lt;a href="//www.cli-ck.dev"&gt;Cli.ck&lt;/a&gt;, aimed at making click tracks easier for small bands to use. If you're interested in that, or just want to follow my journey, sign up for the waitlist &lt;a href="//www.cli-ck.dev"&gt;here&lt;/a&gt;. I'll be updating you about the behind-the-scenes of the development process.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>react</category>
    </item>
    <item>
      <title>Do people want your SaaS?</title>
      <dc:creator>Josh Lawson</dc:creator>
      <pubDate>Wed, 10 Jul 2024 10:04:28 +0000</pubDate>
      <link>https://forem.com/joshlawson100/do-people-want-your-saas-1ppj</link>
      <guid>https://forem.com/joshlawson100/do-people-want-your-saas-1ppj</guid>
      <description>&lt;p&gt;So you've found your next SaaS idea: a platform that translates cat meows into Shakespearean sonnets. You're confident it will make millions and be the next biggest app of the year. You then go on to get 5 customers and lose hundreds of dollars on a product that flopped. The issue: no one wanted your SaaS. It's one thing to find an idea, but it's another thing to find a good one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The key to good ideas: Validation
&lt;/h2&gt;

&lt;p&gt;Let's face it. &lt;em&gt;Good&lt;/em&gt; startup ideas come once in a blue moon. Everyone these days seems to think they've got the next great idea that will bring them $100k/month so they can quit their day job and go live in Bali. Spoiler alert, it won't. But for those of you nieve enough to continue down the startup rabbit hole, validating your idea could just be the single biggest factor determining if your startup flops or flies.&lt;/p&gt;

&lt;p&gt;According to [Harvard Business School (&lt;a href="https://online.hbs.edu/blog/post/market-validation" rel="noopener noreferrer"&gt;https://online.hbs.edu/blog/post/market-validation&lt;/a&gt;), market validation is the process of determining if there’s a need for your product in your target market. Why is this important? Because even the best ideas are meaningless unless you can have customers at scale that pay for your startup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9nk8o1ot979dd4b3d5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff9nk8o1ot979dd4b3d5e.png" alt="Startup idea meme" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Without proper validation, you'll spend months or even years developing your MVP, only to find that no one wants it and you've wasted countless hours and dollars. That's why it is essential that you don't make the mistake that just because you think your idea is good, it doesn't mean that others share the same view.&lt;/p&gt;

&lt;p&gt;Here are the 2 things I always consider before starting a SaaS startup:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Does it solve a Pain Point?
&lt;/h2&gt;

&lt;p&gt;The number 1 rule to remember is that money is an exchange of value. Without getting into the specifics of it here, if someone doesn't see the value in your product, they aren't going to hand over any money. And the best way to ensure customers see the value in your product is for it to solve a pain point.&lt;/p&gt;

&lt;p&gt;Consider a habit tracker app and a ride-sharing service like Uber or Lyft. The habit tracker targets individuals who want to break bad habits, while the ride-sharing service appeals to anyone needing transportation from point A to point B without a car. Now, imagine launching both products simultaneously with identical marketing strategies. I can confidently predict that the ride-sharing app would outperform the habit tracker by a significant margin.&lt;/p&gt;

&lt;p&gt;Why? Because the habit tracker is like a vitamin—it’s beneficial but not essential. In contrast, the ride-sharing app is like a painkiller—it addresses an urgent need. As Mark Lou’s analogy suggests, you want to focus on ideas that solve unmet customer needs, not just create something that’s ‘nice to have’.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyjqq1j1psx1r998j1z08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyjqq1j1psx1r998j1z08.png" alt="Vitamins vs Painkillers" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Would you &lt;em&gt;(Really)&lt;/em&gt; use it?
&lt;/h2&gt;

&lt;p&gt;I'm a drummer. That's why I'm developing &lt;a href="//www.cli-ck.dev"&gt;Cli.ck&lt;/a&gt;, a click track creation tool for small bands. I created Cli.ck because I'd use it. The advantage of this is that I know what others would want from it because I am my target market. It would make no sense for me to go and build an AI flower identification tool because, frankly, I hate gardening. I would never use my app and would have no idea what others want from it.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to validate your idea
&lt;/h2&gt;

&lt;p&gt;Ok, now you've established if your idea is a good one in theory, it's time to see if others agree with you. The easiest way to do this is to set up a waitlist. Create a simple landing page that explains your product and its benefits, and include a form for interested users to sign up for updates. Promote this page through social media, forums, and other channels where your target audience hangs out.&lt;/p&gt;

&lt;p&gt;Collecting emails from potential users not only validates interest but also builds a list of early adopters who can provide valuable feedback and help spread the word about your product.&lt;/p&gt;

&lt;p&gt;I launched my waitlist for &lt;a href="//www.cli-ck.dev"&gt;Cli.ck&lt;/a&gt; only 3 days ago, and already have over 30 people on the waitlist. And while this number doesn't sound massive, 30 customers paying $15/month is over $450/month or $5400/year, and while that isn't enough to quit your job for, it's starting revenue that you can use to promote your SaaS further.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8aea3c2w5a2osabf6pr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8aea3c2w5a2osabf6pr.png" alt="Resend Contacts" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;There is no such thing as a perfect idea. All ideas are born ugly, and some stay that way. The only real way to know is to launch your idea and find out, but idea validation is a good way to minimize the risk. So, before you dive headfirst into development, take the time to validate your idea. Conduct surveys, create landing pages, engage with potential customers, and most importantly, listen to their feedback.&lt;/p&gt;

&lt;p&gt;Validating your startup idea is not just a step; it’s a continuous process. Keep refining your concept based on the feedback and market needs. This approach not only saves you time and resources but also increases the chances of your startup succeeding.&lt;/p&gt;

&lt;p&gt;So, before you write a single line of code, remember: validate, validate, validate.&lt;/p&gt;

&lt;p&gt;- Josh&lt;/p&gt;

&lt;p&gt;P.S: I'm currently developing my own SaaS, &lt;a href="//www.cli-ck.dev"&gt;Cli.ck&lt;/a&gt;, aimed at making click tracks easier for small bands to use. If you're interested in that, or just want to follow my journey, sign up for the waitlist &lt;a href="//www.cli-ck.dev"&gt;here&lt;/a&gt;. I'll be updating weekly about the behind-the-scenes of the development process.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>saas</category>
    </item>
    <item>
      <title>You're starting SaaS startups wrong</title>
      <dc:creator>Josh Lawson</dc:creator>
      <pubDate>Sun, 07 Jul 2024 03:15:04 +0000</pubDate>
      <link>https://forem.com/joshlawson100/youre-starting-saas-startups-wrong-5ama</link>
      <guid>https://forem.com/joshlawson100/youre-starting-saas-startups-wrong-5ama</guid>
      <description>&lt;p&gt;Launching your first SaaS is always rewarding, although it isn't always easy. More often than not, your first few (or many) startups will fail or never get off the ground like you hoped. Sometimes this is because your idea is holding you back, but sometimes it is because you missed a few key steps when launching your SaaS. Today, I'll cover some of the things I've learned while launching my first SaaS startup, Cli.ck.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Find an Idea
&lt;/h3&gt;

&lt;p&gt;I've covered this in my last post (Go check it out after this), but to summarise, your SaaS needs to provide value. Every successful SaaS starts with a problem that needs solving. Look around your industry or personal life and identify a gap technology can fill. Maybe you’ve noticed a cumbersome process at work or a task that could be streamlined. Once you’ve pinpointed the problem, you’re already on your way.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Validate your idea
&lt;/h3&gt;

&lt;p&gt;There's nothing worse than spending 3 months on a project only to realise no one wants it and you've wasted your time. So before developing your MVP, which I'll cover in step 4, make sure there's a demand for your SaaS. Talk to potential customers, mention it on related forums, and post about your idea on social media channels. Once you're getting enough positive responses, you're good to begin development&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Plan your product
&lt;/h3&gt;

&lt;p&gt;Sketch out what your product will do and how it will work. Focus on the core features that address the problem you identified. Remember, it’s better to start small and expand later. Create wireframes or mockups to visualize your product. Keep it simple and user-friendly.&lt;/p&gt;

&lt;p&gt;Additionally, decide on a tech stack. While there will always be the next best product or web framework, choose something that works for you and stick with it. This will make development easier in the long run. Here's the tech stack I currently use for developing Cli.ck:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Front-end:&lt;/strong&gt; Next.js with TailwindCSS and DaisyUI&lt;br&gt;
&lt;strong&gt;Back-end:&lt;/strong&gt; Node.js&lt;br&gt;
&lt;strong&gt;Emails:&lt;/strong&gt; Resend&lt;br&gt;
&lt;strong&gt;Database:&lt;/strong&gt; Supabase&lt;br&gt;
&lt;strong&gt;Payments:&lt;/strong&gt; Stripe&lt;br&gt;
&lt;strong&gt;Hosting:&lt;/strong&gt; Vercel&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Develop your MVP
&lt;/h3&gt;

&lt;p&gt;Build a Minimum Viable Product (MVP) – a basic version of your product with just enough features to solve the problem and attract early adopters. This version allows you to test your concept without investing too much time and money. Use agile development to iterate quickly based on user feedback. &lt;/p&gt;

&lt;p&gt;The biggest tip I can give here is to utilise Generative AI during your development. ChatGPT or GitHub Copilot are much better and quicker at debugging issues than your average developer, so use them to your advantage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Build a Waitlist
&lt;/h3&gt;

&lt;p&gt;This should really be step 4.5 (although it also fits in step 2). Build a simple waitlist to collect emails from potential customers. It can be as simple as a one-page website with a simple header and a call-to-action with an email field, but all it needs to do is build your initial customer base.  Use something like Resend to handle email collection, and optionally send weekly development updates to engage your audience.&lt;/p&gt;

&lt;p&gt;If you want an example, check out the Cli.ck waitlist I built &lt;a href="https://www.cli-ck.dev/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Launch! (Kinda...)
&lt;/h3&gt;

&lt;p&gt;Once your MVP is ready, launch it to a select group of users. Ideally, this is the group you collected from your waitlist, although it doesn't have to be. Gather their feedback and use it to improve your product. Don’t be afraid to make changes. Iteration is key in the SaaS world. The goal is to refine your product until it meets your users' needs perfectly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: &lt;em&gt;Actually&lt;/em&gt; Launch
&lt;/h3&gt;

&lt;p&gt;Now you've ironed out any creases and bugs in your beta version, it's time to release it to the public. Market like crazy on every possible social media platform and related forum, and possibly paid ads. Turn the customer emails on your waitlist into the start of your newsletter, and pump out weekly emails. The key here is to be consistent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus Tip: Keep Learning
&lt;/h3&gt;

&lt;p&gt;The tech landscape is always evolving, and so should you. Stay updated with the latest trends, tools, and best practices. Engage with the SaaS community, attend webinars, and read industry blogs. Continuous learning will keep you ahead of the curve.&lt;/p&gt;

&lt;p&gt;Starting a SaaS business is a thrilling adventure filled with ups and downs. By following these steps, you'll be well on your way to creating a product that not only solves a real problem but also brings value to your users. So, roll up your sleeves, get started, and enjoy the journey!&lt;/p&gt;

&lt;p&gt;- Josh&lt;/p&gt;

&lt;p&gt;P.S.: I'm currently developing my own SaaS, Cli.ck, aimed at making click tracks easier for small bands to use. If you're interested in that, or just want to follow my journey, sign up for the waitlist &lt;a href="https://www.cli-ck.dev/" rel="noopener noreferrer"&gt;here&lt;/a&gt;. I'll be updating weekly about the behind-the-scenes of the development process. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>saas</category>
    </item>
    <item>
      <title>Why you won't find a SaaS idea</title>
      <dc:creator>Josh Lawson</dc:creator>
      <pubDate>Wed, 26 Jun 2024 10:43:16 +0000</pubDate>
      <link>https://forem.com/joshlawson100/finding-saas-ideas-2m8c</link>
      <guid>https://forem.com/joshlawson100/finding-saas-ideas-2m8c</guid>
      <description>&lt;p&gt;The other day, I sat down at my desk ready to complete my daily list of mundane tasks, when it hit me:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Why aren't I working for myself?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I mean, think about it. No boss telling you what to do, no deadlines, &lt;em&gt;&lt;strong&gt;no annoying co-workers&lt;/strong&gt;&lt;/em&gt;, sounds like a dream. &lt;strong&gt;You&lt;/strong&gt; decide when you log on and off, &lt;strong&gt;you&lt;/strong&gt; decide what you work on, and &lt;strong&gt;you&lt;/strong&gt; set your deadlines. &lt;/p&gt;

&lt;h1&gt;
  
  
  What is a SaaS Startup?
&lt;/h1&gt;

&lt;p&gt;Naturally, I turned to SaaS, the latest hot topic in the world of software development. I'm sure most people know what it is, or at least have heard of it. Love it or not, it's one of the easiest ways to profit from programming, next to freelancing.&lt;/p&gt;

&lt;p&gt;For those who have been living under a rock for the past couple of years, a SaaS Startup is a company that offers software as a service, paid for by end users usually in a subscription model. They're usually developed by individuals or small teams, giving them the potential for large revenue margins. They often focus on delivering a solution to a specific audience's issues,  while building a loyal customer base simultaneously.&lt;/p&gt;

&lt;p&gt;But I'll save the specifics of starting a SaaS Startup for another article. Instead, today I want to focus on the very first step for any SaaS Startup.&lt;/p&gt;

&lt;h1&gt;
  
  
  So what do I build?
&lt;/h1&gt;

&lt;p&gt;You've decided to launch your own SaaS Startup, planning to build the next Instagram. So you open up your favourite code editor (Dark mode, hopefully) run &lt;code&gt;npm create next app&lt;/code&gt; and...&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Wait, where do I start?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We've all been there, motivated to begin programming, but then overwhelmed by the blank file. This is precisely the reason why it is crucial to &lt;em&gt;know&lt;/em&gt; what you're going to build &lt;em&gt;before&lt;/em&gt; you build it.&lt;/p&gt;

&lt;p&gt;"But where do you find SaaS ideas? They don't just grow on trees, Josh". Correct! But the main issue with this question is it ignores the premise of a SaaS Startup. The market for startups is extremely oversaturated, so you need to make sure yours stands out. It can't just &lt;em&gt;'exist'&lt;/em&gt;, it needs to solve something. The best startups succeed because they solve something most people experience, but are too lazy to solve.&lt;/p&gt;

&lt;p&gt;The key to finding a SaaS idea is to look at other's pain. People are only going to pay for something that brings value to them, so you need to provide them with that value before they'll hand over their bank details. &lt;/p&gt;

&lt;p&gt;Even if you don't find anything good, start creating something. Make a fun little game, write a blog post like this one, build a note-taking app. There will be issues along the way that you'll encounter, and boom, there's your SaaS Startup&lt;/p&gt;

&lt;p&gt;Stop thinking, start doing.&lt;/p&gt;

&lt;p&gt;- Josh&lt;/p&gt;

</description>
      <category>saas</category>
      <category>webapp</category>
      <category>webdev</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
