<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: John Liter</title>
    <description>The latest articles on DEV Community by John Liter (@realjohnliter).</description>
    <link>https://dev.to/realjohnliter</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F659460%2Fe0f4e6a4-8e39-4309-853e-254f91cafd3a.jpg</url>
      <title>DEV Community: John Liter</title>
      <link>https://dev.to/realjohnliter</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/realjohnliter"/>
    <language>en</language>
    <item>
      <title>I Built DevCommand and Ended Up Changing the Way I Deploy Websites</title>
      <dc:creator>John Liter</dc:creator>
      <pubDate>Fri, 04 Sep 2026 02:15:38 +0000</pubDate>
      <link>https://dev.to/realjohnliter/i-built-devcommand-and-ended-up-changing-the-way-i-deploy-websites-3m6j</link>
      <guid>https://dev.to/realjohnliter/i-built-devcommand-and-ended-up-changing-the-way-i-deploy-websites-3m6j</guid>
      <description>&lt;p&gt;I originally set out to solve a much smaller problem.&lt;/p&gt;

&lt;p&gt;As I've spent more time developing websites and applications, I've accumulated a growing list of commands that I use regularly enough to recognize but not always regularly enough to remember. Git, Linux, SSH, npm, Composer, Docker, database management—there is always some command where I remember what I need to do but not the exact syntax to do it. I could search for it every time, dig through old projects, or ask AI, but eventually I started wondering why I hadn't built my own reference.&lt;/p&gt;

&lt;p&gt;That idea became &lt;strong&gt;DevCommand&lt;/strong&gt;, which I'm building around a simple concept: &lt;strong&gt;Your developer command companion.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project started as a practical tool for myself, but somewhere between building it and getting it online, it became part of a much larger change in how I'm approaching development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outgrowing the Way I Used to Work
&lt;/h2&gt;

&lt;p&gt;For quite a while, Hostinger's File Manager was a normal part of my development process. If I needed to change something on one of my sites, I could log in, find the PHP, CSS, or JavaScript file, edit it, save it, refresh the site, and move on. For the kinds of websites I was building at the time, it worked well enough.&lt;/p&gt;

&lt;p&gt;My projects aren't as simple anymore.&lt;/p&gt;

&lt;p&gt;I'm working with React applications, PHP sites, APIs, databases, automation, and projects with increasingly more moving parts. At the same time, I've been using VS Code and Git more heavily in my local development. The disconnect started becoming obvious: I was developing more seriously on my computer, but I was still treating deployment like I had when my projects were much smaller.&lt;/p&gt;

&lt;p&gt;Editing a production file directly is fast right up until something goes wrong. There is no commit to roll back to if you haven't created one, and it becomes easy for the copy on your computer, the copy in GitHub, and the copy actually running on the server to drift apart. I didn't want three versions of a project with me trying to remember which one was current.&lt;/p&gt;

&lt;p&gt;So while working on DevCommand, I decided to change that.&lt;/p&gt;

&lt;p&gt;I wanted the process to be simple: build locally, track everything with Git, push the finished work to GitHub, and have the production server receive that version automatically.&lt;/p&gt;

&lt;p&gt;The concept was straightforward. Getting it working was not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Deployment Pipeline
&lt;/h2&gt;

&lt;p&gt;GitHub Actions seemed like the obvious bridge between GitHub and Hostinger. My goal was to make a push to the production branch mean something. Instead of pushing code to GitHub and then logging into Hostinger to repeat the deployment manually, that push would trigger the deployment itself.&lt;/p&gt;

&lt;p&gt;This meant setting up SSH access between GitHub and my Hostinger account, creating deployment keys, storing the necessary information in GitHub Secrets, configuring the correct server paths, and using &lt;code&gt;rsync&lt;/code&gt; to synchronize the production files.&lt;/p&gt;

&lt;p&gt;This was also where I spent a good amount of time staring at red GitHub Actions runs.&lt;/p&gt;

&lt;p&gt;At one point, the workflow file itself was being flagged with errors claiming required properties like &lt;code&gt;on&lt;/code&gt; and &lt;code&gt;jobs&lt;/code&gt; were missing. After getting past that, the Action could run, but the files still weren't reaching the directory where they were supposed to go. Fixing one problem often just exposed the next one.&lt;/p&gt;

&lt;p&gt;That process was frustrating, but it was also useful because I couldn't just click around until something magically worked. Each failure narrowed the problem. Was GitHub reading the workflow? Could the Action authenticate over SSH? Was it reaching the correct server? Was &lt;code&gt;rsync&lt;/code&gt; pointing at the correct local directory? Was the destination path right?&lt;/p&gt;

&lt;p&gt;Eventually, the pieces started falling into place. The deployment key authenticated successfully. The repository secrets were correct. The workflow appeared in GitHub Actions and executed properly. &lt;code&gt;rsync&lt;/code&gt; reached Hostinger.&lt;/p&gt;

&lt;p&gt;Then I pushed another change and watched the workflow finish with a green checkmark.&lt;/p&gt;

&lt;p&gt;More importantly, I checked the server and the files were actually there.&lt;/p&gt;

&lt;p&gt;That was the moment the whole thing clicked.&lt;/p&gt;

&lt;h2&gt;
  
  
  DevCommand Was a Little Different
&lt;/h2&gt;

&lt;p&gt;Once I had the deployment process working for my other sites, DevCommand presented another challenge. Unlike some of my PHP projects, the files in the repository aren't the files that should simply be copied directly to the web server. DevCommand has to be built first.&lt;/p&gt;

&lt;p&gt;That meant modifying the deployment process so GitHub could take care of the build as well. The workflow checks out the repository, prepares Node.js, installs the dependencies, runs the production build, and then sends the generated &lt;code&gt;dist&lt;/code&gt; files to Hostinger.&lt;/p&gt;

&lt;p&gt;In practical terms, I can now work on DevCommand locally, test what I'm building, commit the changes, and push them to GitHub. From there, the production build and deployment happen without me manually transferring anything.&lt;/p&gt;

&lt;p&gt;That may be routine for developers who have been working with CI/CD pipelines for years, but actually building the process for my own projects gave me a much better understanding of what is happening between source code and production.&lt;/p&gt;

&lt;p&gt;Before this, I tended to think of deployment mostly as moving updated files onto a server. DevCommand forced me to think about the distinction between the source of an application and the artifact that actually gets deployed. GitHub isn't simply storing a backup of my code anymore; it's now an active part of how that code becomes the production application.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Better Foundation for Everything Else I'm Building
&lt;/h2&gt;

&lt;p&gt;The biggest result of this project isn't that I no longer have to open Hostinger's File Manager as often. Saving a few clicks isn't particularly interesting. What matters is that my development process finally has a clear source of truth.&lt;/p&gt;

&lt;p&gt;The project on my computer is where I work. Git records what changes. GitHub holds the repository and its history. The deployment workflow determines what reaches production. If something goes wrong later, I have a much clearer trail showing what changed and when.&lt;/p&gt;

&lt;p&gt;It also changes the way I think about commits. A commit isn't just a checkpoint I create because Git expects me to. When a push can ultimately result in a production deployment, being deliberate about what I'm committing becomes much more important.&lt;/p&gt;

&lt;p&gt;There is another benefit that I didn't fully appreciate until I saw the workflow running successfully: I can reuse what I learned.&lt;/p&gt;

&lt;p&gt;DevCommand isn't going to be the only project I maintain. I already have several sites, applications, and client projects, and there will be more. I don't want to reinvent deployment every time I build something. Establishing this process gives me a foundation that can be adapted depending on whether a project is a traditional PHP site, a React application that needs to be built, or something more complex later.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Started as a Command Reference
&lt;/h2&gt;

&lt;p&gt;That's probably my favorite part of this entire project.&lt;/p&gt;

&lt;p&gt;I sat down to build a tool because I was tired of looking up commands.&lt;/p&gt;

&lt;p&gt;Instead, the project pushed me into SSH authentication, deployment keys, GitHub Secrets, YAML configuration, &lt;code&gt;rsync&lt;/code&gt;, build artifacts, server paths, and automated deployments. Some of those were things I already understood conceptually, but there is a different level of understanding that comes from having to make all of them work together.&lt;/p&gt;

&lt;p&gt;There were plenty of failed runs along the way, and I don't think hiding those makes the finished project any more impressive. If anything, those failures are the useful part. The green checkmark only meant something because I understood most of what had to happen for it to finally appear.&lt;/p&gt;

&lt;p&gt;DevCommand is currently running at &lt;strong&gt;devcommand.johnliter.de&lt;/strong&gt;, with &lt;strong&gt;devcommand.app&lt;/strong&gt; planned as its eventual home. I have more I want to add to it, and I want it to become a genuinely useful command companion rather than just another static cheat sheet.&lt;/p&gt;

&lt;p&gt;But even in its current state, the project has already done more for me than I originally intended.&lt;/p&gt;

&lt;p&gt;I built DevCommand because I wanted a better way to reference the tools I use while developing.&lt;/p&gt;

&lt;p&gt;In the process, I built a better way to ship the things I create.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>githubactions</category>
      <category>devops</category>
      <category>automation</category>
    </item>
    <item>
      <title>Converting a Lead Into a Customer in PHP Without Creating Duplicate Records</title>
      <dc:creator>John Liter</dc:creator>
      <pubDate>Thu, 27 Aug 2026 20:07:21 +0000</pubDate>
      <link>https://dev.to/realjohnliter/converting-a-lead-into-a-customer-in-php-without-creating-duplicate-records-132m</link>
      <guid>https://dev.to/realjohnliter/converting-a-lead-into-a-customer-in-php-without-creating-duplicate-records-132m</guid>
      <description>&lt;h1&gt;
  
  
  Converting a Lead Into a Customer in PHP Without Creating Duplicate Records
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;A practical PHP and MySQL pattern for checking existing customers before inserting another record.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Building a CRM has forced me to think about problems that look simple in the interface but become more interesting once I start working through the database logic behind them. One of those problems is converting a lead into a customer.&lt;/p&gt;

&lt;p&gt;From the user's perspective, the workflow is straightforward: open a lead, click a button, and turn that lead into a customer. From the database's perspective, there is an important question that needs to be answered first:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this customer already exist?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without that check, clicking &lt;strong&gt;Convert to Customer&lt;/strong&gt; can easily create duplicate customer records. Those duplicates eventually affect everything connected to the customer: invoices, quotes, appointments, work orders, communication history, and reporting.&lt;/p&gt;

&lt;p&gt;Here is the approach I use to think about this problem in a PHP/MySQL application.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Basic Data Model
&lt;/h2&gt;

&lt;p&gt;A simple CRM might begin with separate &lt;code&gt;leads&lt;/code&gt; and &lt;code&gt;customers&lt;/code&gt; tables.&lt;/p&gt;

&lt;p&gt;A lead represents someone who has entered the sales pipeline but has not necessarily become a customer yet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;leads&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="nb"&gt;UNSIGNED&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;phone&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'new'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The customer table contains people or businesses that have moved beyond the lead stage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="nb"&gt;UNSIGNED&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;phone&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact schema will depend on the application. The important part is recognizing that converting a lead should not automatically mean inserting a new customer.&lt;/p&gt;

&lt;p&gt;First, I need to determine whether that person is already represented in &lt;code&gt;customers&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Checking by Name Is Not Enough
&lt;/h2&gt;

&lt;p&gt;An obvious first attempt would be something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is better than performing no duplicate check at all, but names make poor identifiers.&lt;/p&gt;

&lt;p&gt;Two customers can legitimately have the same name. The same customer's name might also be entered differently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;John Liter
John A. Liter
john liter
J. Liter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Business names introduce similar problems.&lt;/p&gt;

&lt;p&gt;Whenever possible, I would rather use stronger identifiers such as an email address or phone number.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The problem is that not every lead will necessarily have an email address. A practical CRM may therefore need to check more than one field.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking for an Existing Customer With PHP
&lt;/h2&gt;

&lt;p&gt;Using PDO and prepared statements, the application can look for an existing customer before inserting anything.&lt;/p&gt;

&lt;p&gt;A simplified example looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$existingCustomer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$lead&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$stmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'SELECT id
         FROM customers
         WHERE email = ?
         LIMIT 1'&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;$lead&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;]]);&lt;/span&gt;
    &lt;span class="nv"&gt;$existingCustomer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;PDO&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;FETCH_ASSOC&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$existingCustomer&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$lead&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'phone'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$stmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'SELECT id
         FROM customers
         WHERE phone = ?
         LIMIT 1'&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nv"&gt;$lead&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'phone'&lt;/span&gt;&lt;span class="p"&gt;]]);&lt;/span&gt;
    &lt;span class="nv"&gt;$existingCustomer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;PDO&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;FETCH_ASSOC&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This establishes a simple priority:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email → Phone → No Match&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If an email matches an existing customer, I can use that customer's ID instead of creating another record. If there is no email match, I can try the phone number.&lt;/p&gt;

&lt;p&gt;The application now has a decision to make.&lt;/p&gt;

&lt;h2&gt;
  
  
  Insert Only When Necessary
&lt;/h2&gt;

&lt;p&gt;If no customer was found, then I can create one from the lead information.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nv"&gt;$existingCustomer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$stmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;'INSERT INTO customers (name, email, phone)
         VALUES (?, ?, ?)'&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="nv"&gt;$lead&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="nv"&gt;$lead&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="nv"&gt;$lead&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'phone'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;

    &lt;span class="nv"&gt;$customerId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;lastInsertId&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$customerId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$existingCustomer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;code&gt;$customerId&lt;/code&gt; points to the correct customer regardless of which path was taken.&lt;/p&gt;

&lt;p&gt;That is useful because everything that happens after conversion can reference the same variable. The rest of the application does not necessarily need to care whether the customer was just created or already existed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Database Should Help Enforce the Rule
&lt;/h2&gt;

&lt;p&gt;Application-level checks are useful, but I do not want PHP to be the only thing protecting the database.&lt;/p&gt;

&lt;p&gt;Suppose two requests arrive almost simultaneously.&lt;/p&gt;

&lt;p&gt;Both requests could potentially perform the duplicate check before either inserts the customer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request A → Customer doesn't exist
Request B → Customer doesn't exist
Request A → INSERT
Request B → INSERT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I still have a duplicate.&lt;/p&gt;

&lt;p&gt;This is where database constraints become important.&lt;/p&gt;

&lt;p&gt;If email addresses must be unique in the application, I can enforce that requirement at the database level:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;
&lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;uq_customers_email&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The database is now protecting an assumption that the application depends on.&lt;/p&gt;

&lt;p&gt;That does not eliminate the need for application logic. It gives me another layer of protection.&lt;/p&gt;

&lt;p&gt;The PHP code should also be prepared to handle a duplicate-key exception rather than assuming every insert will succeed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Normalize Before Comparing
&lt;/h2&gt;

&lt;p&gt;Another lesson is that duplicate detection is only as reliable as the data being compared.&lt;/p&gt;

&lt;p&gt;Consider phone numbers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2545551234
254-555-1234
(254) 555-1234
+1 254 555 1234
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those might all represent the same number.&lt;/p&gt;

&lt;p&gt;If I compare the raw strings, MySQL may see completely different values.&lt;/p&gt;

&lt;p&gt;A better approach is to normalize information before storing and comparing it. For a U.S. phone number, that might mean stripping formatting characters and consistently deciding how country codes will be represented.&lt;/p&gt;

&lt;p&gt;Email addresses also deserve normalization. At minimum, whitespace should not be allowed to create accidental differences between otherwise identical values.&lt;/p&gt;

&lt;p&gt;The goal is not simply to ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Are these strings identical?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The more useful question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do these records represent the same real customer?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those are not always the same problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens to the Lead?
&lt;/h2&gt;

&lt;p&gt;Creating or finding the customer is only part of the conversion.&lt;/p&gt;

&lt;p&gt;The lead also needs to reflect what happened.&lt;/p&gt;

&lt;p&gt;One approach is to update its status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$stmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'UPDATE leads
     SET status = ?
     WHERE id = ?'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'won'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nv"&gt;$leadId&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An even more useful design is to maintain a relationship between the original lead and resulting customer.&lt;/p&gt;

&lt;p&gt;For example, the &lt;code&gt;leads&lt;/code&gt; table could contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="nb"&gt;UNSIGNED&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After conversion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$stmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'UPDATE leads
     SET status = ?, customer_id = ?
     WHERE id = ?'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$stmt&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'won'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nv"&gt;$customerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nv"&gt;$leadId&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I have traceability.&lt;/p&gt;

&lt;p&gt;I can determine which lead produced a customer instead of throwing away that relationship once the conversion happens.&lt;/p&gt;

&lt;p&gt;That becomes increasingly useful when I start asking questions about lead sources, conversions, marketing performance, or customer history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consider Using a Transaction
&lt;/h2&gt;

&lt;p&gt;There is another failure scenario worth thinking about.&lt;/p&gt;

&lt;p&gt;Imagine this sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Create customer
2. Update lead
3. Something fails
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the customer is successfully inserted but the lead update fails, the database can end up in an inconsistent state.&lt;/p&gt;

&lt;p&gt;A transaction can make the conversion behave more like one operation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;beginTransaction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Find or create customer.&lt;/span&gt;

    &lt;span class="c1"&gt;// Update the lead with the customer ID.&lt;/span&gt;

    &lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Throwable&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;inTransaction&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$pdo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;rollBack&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact transaction boundaries depend on the application's workflow, but this is the point where I start thinking beyond whether each individual SQL statement works.&lt;/p&gt;

&lt;p&gt;I need to think about whether the &lt;strong&gt;entire business operation&lt;/strong&gt; succeeds.&lt;/p&gt;

&lt;p&gt;That distinction has become increasingly important as I build applications with multiple related tables.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Still Matters on Internal Actions
&lt;/h2&gt;

&lt;p&gt;A conversion button may only exist inside an authenticated CRM, but I still do not want a state-changing action to happen through an unprotected request.&lt;/p&gt;

&lt;p&gt;At minimum, I want to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;li&gt;Authorization&lt;/li&gt;
&lt;li&gt;CSRF protection&lt;/li&gt;
&lt;li&gt;Prepared SQL statements&lt;/li&gt;
&lt;li&gt;Server-side validation&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a &lt;strong&gt;Convert to Customer&lt;/strong&gt; action should generally be a &lt;code&gt;POST&lt;/code&gt; request rather than something triggered simply by visiting a URL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
        &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt;
        &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"csrf_token"&lt;/span&gt;
        &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;?= htmlspecialchars($csrfToken) ?&amp;gt;"&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt;
        &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt;
        &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"lead_id"&lt;/span&gt;
        &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;?= (int) $lead['id'] ?&amp;gt;"&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        Convert to Customer
    &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server then validates the CSRF token and verifies that the authenticated user has permission to perform the conversion.&lt;/p&gt;

&lt;p&gt;Internal software is still software exposed to mistakes and potentially malicious requests.&lt;/p&gt;

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

&lt;p&gt;The interesting part of this feature was not the &lt;code&gt;INSERT&lt;/code&gt; statement. It was realizing how many decisions surround that insert.&lt;/p&gt;

&lt;p&gt;A reliable lead-to-customer conversion needs to answer several questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does this customer already exist?&lt;/li&gt;
&lt;li&gt;What fields determine whether two records represent the same person?&lt;/li&gt;
&lt;li&gt;Is the database enforcing the same assumptions as the PHP application?&lt;/li&gt;
&lt;li&gt;Can I trace the customer back to the original lead?&lt;/li&gt;
&lt;li&gt;What happens if one part of the conversion fails?&lt;/li&gt;
&lt;li&gt;Is the state-changing request properly protected?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is a much different problem from simply copying information from one table into another.&lt;/p&gt;

&lt;p&gt;It is also one of the things I enjoy about building database-backed applications. A button that looks trivial on the frontend can represent several important data-modeling decisions behind the scenes.&lt;/p&gt;

&lt;p&gt;The more interconnected an application becomes, the more those decisions matter.&lt;/p&gt;

</description>
      <category>php</category>
      <category>mysql</category>
      <category>webdev</category>
      <category>database</category>
    </item>
    <item>
      <title>Linus Torvalds – The Reluctant Revolutionary Who Changed Everything</title>
      <dc:creator>John Liter</dc:creator>
      <pubDate>Wed, 09 Jul 2025 13:08:43 +0000</pubDate>
      <link>https://dev.to/realjohnliter/linus-torvalds-the-reluctant-revolutionary-who-changed-everything-9n6</link>
      <guid>https://dev.to/realjohnliter/linus-torvalds-the-reluctant-revolutionary-who-changed-everything-9n6</guid>
      <description>&lt;p&gt;When you think of modern computing, certain names echo through history. Today, we begin this series by spotlighting a man who didn’t just &lt;em&gt;influence&lt;/em&gt; the tech world—he quietly reshaped it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linus Torvalds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’ve ever used a phone, surfed the web, run a server, deployed to the cloud, or pushed code to GitHub—his work touched your life.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧬 Who Is Linus Torvalds?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Born in Finland, 1969&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creator of the &lt;strong&gt;Linux&lt;/strong&gt; operating system kernel (1991)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creator of &lt;strong&gt;Git&lt;/strong&gt;, the version control system that powers almost every modern dev workflow&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What started as a personal side project—“just for fun,” as he called it—became the backbone of the internet, powering everything from Android devices to supercomputers.&lt;/p&gt;




&lt;h3&gt;
  
  
  💻 Why Is Linux So Important?
&lt;/h3&gt;

&lt;p&gt;Torvalds released the Linux kernel as open source. That decision didn’t just start a movement—it &lt;strong&gt;defined&lt;/strong&gt; the open-source culture we benefit from today.&lt;/p&gt;

&lt;p&gt;Linux:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Runs ~70% of the web&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Powers Android phones&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Drives global infrastructure via servers, IoT devices, and embedded systems&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Torvalds never intended to become a tech icon. He just wanted to build something better—and share it.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔄 Oh, and Git? That Was His “Side Project”
&lt;/h3&gt;

&lt;p&gt;When the Linux community needed a better way to manage code in 2005, Linus built Git—in just 10 days.&lt;/p&gt;

&lt;p&gt;Now, &lt;strong&gt;Git is used by millions of developers&lt;/strong&gt; around the world to collaborate, ship code, and build software at scale.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 Why It Matters to Us Today
&lt;/h3&gt;

&lt;p&gt;Torvalds’ story is a reminder that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You don’t need to be loud to be legendary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can change the world with a keyboard and a clear idea.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Great things often start with personal curiosity—not big ambitions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧠 Final Thought
&lt;/h3&gt;

&lt;p&gt;Linus didn’t build Linux or Git to get famous.&lt;br&gt;&lt;br&gt;
He built them because he &lt;strong&gt;cared about doing it right.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And in doing so, he gave the developer world tools we can’t imagine living without.&lt;/p&gt;




&lt;h3&gt;
  
  
  📣 Let’s Talk
&lt;/h3&gt;

&lt;p&gt;💬 What’s your favorite thing about Linux or Git?&lt;/p&gt;

&lt;p&gt;🧠 Who should we feature next in this &lt;em&gt;Tech Legends&lt;/em&gt; series?&lt;/p&gt;

&lt;p&gt;Drop your thoughts in the comments 👇&lt;/p&gt;

</description>
      <category>techlegends</category>
      <category>linustorvalds</category>
      <category>linux</category>
      <category>dailydev</category>
    </item>
    <item>
      <title>Python in 2025: The Language That Still Does It All (and Then Some)</title>
      <dc:creator>John Liter</dc:creator>
      <pubDate>Tue, 08 Jul 2025 13:27:32 +0000</pubDate>
      <link>https://dev.to/realjohnliter/python-in-2025-the-language-that-still-does-it-all-and-then-some-cm5</link>
      <guid>https://dev.to/realjohnliter/python-in-2025-the-language-that-still-does-it-all-and-then-some-cm5</guid>
      <description>&lt;p&gt;It’s 2025.&lt;br&gt;&lt;br&gt;
New frameworks are born every week.&lt;br&gt;&lt;br&gt;
AI tools are reshaping how we code, learn, and build.&lt;br&gt;&lt;br&gt;
And yet… &lt;strong&gt;Python still holds strong.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because Python isn’t just a language.&lt;br&gt;&lt;br&gt;
It’s a &lt;em&gt;gateway.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To creativity.&lt;br&gt;&lt;br&gt;
To automation.&lt;br&gt;&lt;br&gt;
To AI.&lt;br&gt;&lt;br&gt;
To building that “what if?” idea you’ve had sitting in your notes app for months.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 Python Is the Language of Curiosity
&lt;/h3&gt;

&lt;p&gt;You can start with &lt;code&gt;print("Hello, world")&lt;/code&gt; and wind up building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A full-stack web app with Flask or Django&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A trading bot using real-time market data&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An AI chatbot that helps manage your calendar&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A data dashboard tracking your fitness stats&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A game. A script. A tool. A business.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Python isn’t limited by discipline—it &lt;em&gt;connects&lt;/em&gt; them.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤖 Python + AI = A Whole New Level of Possibility
&lt;/h3&gt;

&lt;p&gt;With AI becoming a daily tool for developers, Python has become &lt;strong&gt;the connective tissue&lt;/strong&gt; between human ideas and machine intelligence.&lt;/p&gt;

&lt;p&gt;Want to train a model? Python.&lt;br&gt;&lt;br&gt;
Want to deploy an LLM to a web app? Python.&lt;br&gt;&lt;br&gt;
Want to analyze data, generate images, run automations, or scrape content? Python.&lt;/p&gt;

&lt;p&gt;It’s not hype. It’s happening.&lt;/p&gt;

&lt;p&gt;Whether you're using frameworks like TensorFlow, PyTorch, or LangChain, Python is the backbone of &lt;em&gt;so much of the AI ecosystem&lt;/em&gt; in 2025.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ Python Isn’t Just for Pros—It’s for Problem-Solvers
&lt;/h3&gt;

&lt;p&gt;What I love about Python is how &lt;em&gt;inviting&lt;/em&gt; it is.&lt;/p&gt;

&lt;p&gt;You don’t need to be a "real developer" to start writing useful Python code.&lt;br&gt;&lt;br&gt;
You just need a problem you're passionate about solving.&lt;/p&gt;

&lt;p&gt;And in this AI-powered future, Python lets you go from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I wish I could…”&lt;br&gt;&lt;br&gt;
to&lt;br&gt;&lt;br&gt;
“I built this to fix it.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🌍 What Are You Using Python For in 2025?
&lt;/h3&gt;

&lt;p&gt;That’s the conversation I want to have.&lt;/p&gt;

&lt;p&gt;Are you using it for AI? For automation?&lt;br&gt;&lt;br&gt;
Building a SaaS? Hacking on side projects?&lt;br&gt;&lt;br&gt;
Teaching your kids to code? Creating tools that help your community?&lt;/p&gt;

&lt;p&gt;Let’s stop thinking of Python as “just a scripting language.”&lt;/p&gt;

&lt;p&gt;In the hands of someone who’s curious, it’s a &lt;strong&gt;superpower&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;💬 &lt;strong&gt;Drop your thoughts below:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What’s the most creative thing you’ve built in Python?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Where do you see Python going in the next 5 years?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What’s one use case people don’t talk about enough?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s have a real dev-to-dev conversation.&lt;br&gt;&lt;br&gt;
Because this language?&lt;br&gt;&lt;br&gt;
Still changing lives. Still elevating skills. Still just getting started.&lt;/p&gt;

</description>
      <category>python2025</category>
      <category>aiandpython</category>
      <category>learntocode</category>
      <category>dailydev</category>
    </item>
    <item>
      <title>Why Teaching Our Kids About Their Tech Is More Important Than Ever</title>
      <dc:creator>John Liter</dc:creator>
      <pubDate>Sat, 05 Jul 2025 13:07:52 +0000</pubDate>
      <link>https://dev.to/realjohnliter/why-teaching-our-kids-about-their-tech-is-more-important-than-ever-2485</link>
      <guid>https://dev.to/realjohnliter/why-teaching-our-kids-about-their-tech-is-more-important-than-ever-2485</guid>
      <description>&lt;p&gt;Image generated using &lt;a href="https://openai.com/index/dall-e-3/" rel="noopener noreferrer"&gt;DALL-E&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As I start my next college class, &lt;em&gt;Introduction to Information Security,&lt;/em&gt; I’ve had a wake-up call:&lt;/p&gt;

&lt;p&gt;Most people—even those who use the internet every day—know almost nothing about their own home Wi-Fi.&lt;/p&gt;

&lt;p&gt;They get internet service from a provider, the installer hands them a router, and they just…start browsing. The password? Usually the default one printed on the sticker—never changed, never thought about again.&lt;/p&gt;

&lt;p&gt;Reading through my classmates’ responses this week, I saw a pattern:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I didn’t realize how much I was lacking when it comes to securing my time online.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And it hit me:&lt;/p&gt;

&lt;p&gt;If adults don’t understand the basics of the hardware and networks they rely on, &lt;strong&gt;how can we expect our kids to grow up safe and smart online?&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🛡️ Digital Safety Starts at Home
&lt;/h3&gt;

&lt;p&gt;It’s not enough to teach kids how to avoid suspicious links or choose strong passwords.&lt;br&gt;&lt;br&gt;
We need to teach them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;How a router works&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Why you should change default passwords&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What encryption is and why it matters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How devices connect to Wi-Fi and share data&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding the &lt;em&gt;hardware&lt;/em&gt; and &lt;em&gt;connections&lt;/em&gt; gives them power—so they don’t just use tech blindly, but know what’s happening under the hood.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 Why It Matters
&lt;/h3&gt;

&lt;p&gt;Our kids aren’t just watching YouTube and doing homework online—they’re building habits that will stick with them for life. If we teach them now how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Secure their devices&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recognize insecure networks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Question the default settings they’re given&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’re giving them tools to protect themselves in an increasingly connected world.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 Let’s Talk
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Did you grow up learning how your own Wi-Fi or devices worked?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What have you taught your kids (or wish you had) about tech safety?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How can we make understanding the basics of our devices as normal as teaching kids how to ride a bike?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we want the next generation to thrive online, we need to start by teaching them what’s happening &lt;em&gt;offline&lt;/em&gt;—right at home.&lt;/p&gt;

</description>
      <category>digitalliteracy</category>
      <category>infosecbasics</category>
      <category>internetsafety</category>
      <category>parentingintech</category>
    </item>
    <item>
      <title>Why I Fell in Love with Coding (and Why I’m Still Addicted to It)</title>
      <dc:creator>John Liter</dc:creator>
      <pubDate>Thu, 26 Jun 2025 13:24:42 +0000</pubDate>
      <link>https://dev.to/realjohnliter/why-i-fell-in-love-with-coding-and-why-im-still-addicted-to-it-jfn</link>
      <guid>https://dev.to/realjohnliter/why-i-fell-in-love-with-coding-and-why-im-still-addicted-to-it-jfn</guid>
      <description>&lt;p&gt;For me, coding didn’t start with a job listing, a college course, or a trendy tech video.&lt;/p&gt;

&lt;p&gt;It started with &lt;strong&gt;FreeCodeCamp.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Their guided tutorials gave me structure. The community gave me encouragement. And the moment that &lt;em&gt;really&lt;/em&gt; stuck with me? When I got stuck on a problem—and instead of giving me the answer, someone helped me &lt;em&gt;understand&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;That’s when I realized:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Coding isn’t just about getting things to work. It’s about learning how to think.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🔤 It Started with the Basics
&lt;/h3&gt;

&lt;p&gt;HTML, CSS, and JavaScript were the first tools I used to bring my ideas to life.&lt;/p&gt;

&lt;p&gt;I didn’t need anything complex—I just needed something to get started.&lt;br&gt;&lt;br&gt;
Once I finished the basics, my curiosity exploded. I began exploring new languages, frameworks, and tools—not to be trendy, but to &lt;strong&gt;make my original ideas even better.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🤖 How AI Made Me a Smarter Coder
&lt;/h3&gt;

&lt;p&gt;When I hit a wall, I don’t panic. I ask AI.&lt;/p&gt;

&lt;p&gt;But I don’t just want a copy-paste answer—I want an &lt;em&gt;explanation.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
Why does this work?&lt;br&gt;&lt;br&gt;
What’s the logic behind it?&lt;br&gt;&lt;br&gt;
Can I see the original docs or pages this came from?&lt;/p&gt;

&lt;p&gt;That’s how I grow. I don’t just collect answers—I collect understanding.&lt;/p&gt;

&lt;p&gt;Even when debugging, I’ll have &lt;strong&gt;GitHub Copilot&lt;/strong&gt; walk me through what I did wrong. Often, that small spark of explanation is all I need for the solution to click.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 I Document Everything in Notion (So I Can Teach It Later)
&lt;/h3&gt;

&lt;p&gt;I take every insight, every “aha” moment, and drop it into Notion.&lt;br&gt;&lt;br&gt;
It’s not just my second brain—it’s a place I turn ideas into &lt;strong&gt;mini lessons&lt;/strong&gt; I teach to my kids.&lt;/p&gt;

&lt;p&gt;There’s something powerful about learning &lt;em&gt;and&lt;/em&gt; sharing that knowledge.&lt;br&gt;&lt;br&gt;
When I see my kids light up after understanding a concept I just struggled through? That’s better than any shipped feature.&lt;/p&gt;




&lt;h3&gt;
  
  
  💡 The Ideas Never Stop
&lt;/h3&gt;

&lt;p&gt;My mind is constantly buzzing with ideas for web pages, apps, and tools.&lt;br&gt;&lt;br&gt;
So I keep a running checklist—a digital playground of possibility.&lt;br&gt;&lt;br&gt;
Some will get built. Others won’t. But every one of them fuels the fire.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔥 Coding Is My Passion—And AI Made It Even Deeper
&lt;/h3&gt;

&lt;p&gt;AI hasn’t made me lazy—it’s made me &lt;strong&gt;more curious&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
More experimental.&lt;br&gt;&lt;br&gt;
More obsessed with understanding how far I can take my ideas.&lt;/p&gt;

&lt;p&gt;Every project I finish teaches me something new.&lt;br&gt;&lt;br&gt;
Every bug I fix reminds me why I started.&lt;br&gt;&lt;br&gt;
And every time I teach what I’ve learned, I fall in love with coding all over again.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 Let’s Talk
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What made &lt;em&gt;you&lt;/em&gt; fall in love with coding?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How are you using AI to learn, not just code faster?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do you document what you learn—and if so, how?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop your thoughts.&lt;br&gt;&lt;br&gt;
Let’s celebrate the journey—not just the results.&lt;/p&gt;

</description>
      <category>ilovetocode</category>
      <category>freecodecamp</category>
      <category>codingwithai</category>
      <category>dailydev</category>
    </item>
    <item>
      <title>Why StackEdit Became One of My Favorite Tools as a Developer</title>
      <dc:creator>John Liter</dc:creator>
      <pubDate>Wed, 25 Jun 2025 12:51:58 +0000</pubDate>
      <link>https://dev.to/realjohnliter/why-stackedit-became-one-of-my-favorite-tools-as-a-developer-4463</link>
      <guid>https://dev.to/realjohnliter/why-stackedit-became-one-of-my-favorite-tools-as-a-developer-4463</guid>
      <description>&lt;p&gt;There are a lot of tools that come and go in my workflow.&lt;br&gt;&lt;br&gt;
But every now and then, one sticks—and for me, &lt;strong&gt;StackEdit&lt;/strong&gt; is one of them.&lt;/p&gt;

&lt;p&gt;If you haven’t used it (or forgot it existed), it’s basically a browser-based markdown editor with offline support, seamless syncing to Google Drive, GitHub, and more.&lt;/p&gt;

&lt;p&gt;And for something so lightweight, it’s quietly become one of the most &lt;em&gt;reliable&lt;/em&gt; parts of how I organize thoughts, drafts, and even code-adjacent ideas.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 It’s Where I Think in Markdown
&lt;/h3&gt;

&lt;p&gt;I spend a lot of time writing—not just code, but notes, ideas, outlines, README drafts, architecture explanations, blog posts, and documentation snippets.&lt;/p&gt;

&lt;p&gt;For me, writing in markdown just feels right. It’s fast, clean, minimal—and StackEdit handles it beautifully.&lt;/p&gt;

&lt;p&gt;No fluff. No distractions. Just structured text, exactly how I want it.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔄 Sync Is Seamless (and Low-Key a Lifesaver)
&lt;/h3&gt;

&lt;p&gt;StackEdit’s Google Drive integration is kind of underrated. I’ve closed tabs, changed devices, and even lost power—and the content is &lt;em&gt;still there&lt;/em&gt;. No install, no stress.&lt;/p&gt;

&lt;p&gt;There’s a weird comfort in knowing your half-finished thought is waiting for you exactly where you left it.&lt;/p&gt;

&lt;p&gt;And the GitHub sync? Super clean for working on docs or markdown-based repos. I’ve even written full API docs in StackEdit before pushing them to a project.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧩 It Fits in the Gaps Most Tools Miss
&lt;/h3&gt;

&lt;p&gt;It’s not a code editor. It’s not an IDE. It’s not Notion.&lt;br&gt;&lt;br&gt;
It’s &lt;em&gt;not trying to be everything.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But when I need to brainstorm, jot down an idea in markdown, or draft something before making it public—it’s often the first place I go.&lt;/p&gt;

&lt;p&gt;There’s something refreshing about a tool that does one thing &lt;em&gt;really well&lt;/em&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 My Take
&lt;/h3&gt;

&lt;p&gt;Is it fancy? No.&lt;br&gt;&lt;br&gt;
Is it fast, free, and surprisingly powerful? Absolutely.&lt;/p&gt;

&lt;p&gt;Not every tool in my stack has to be groundbreaking.&lt;br&gt;&lt;br&gt;
Some just have to &lt;em&gt;work&lt;/em&gt;—quietly and consistently.&lt;/p&gt;

&lt;p&gt;And StackEdit does that better than most.&lt;/p&gt;




&lt;h3&gt;
  
  
  🙋‍♂️ Curious to Hear From Others:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Have you used StackEdit for your dev notes or docs?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do you still write in markdown outside of GitHub?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What’s your go-to spot for thinking through technical ideas before you commit?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s normalize loving the tools that keep our heads clear—even if they don’t get all the spotlight.&lt;/p&gt;

</description>
      <category>markdowntools</category>
      <category>stackedit</category>
      <category>devnotes</category>
      <category>dailydev</category>
    </item>
    <item>
      <title>Want to Keep Kids Safe Online? Teach Them How the Internet Works</title>
      <dc:creator>John Liter</dc:creator>
      <pubDate>Tue, 24 Jun 2025 12:57:39 +0000</pubDate>
      <link>https://dev.to/realjohnliter/want-to-keep-kids-safe-online-teach-them-how-the-internet-works-38bm</link>
      <guid>https://dev.to/realjohnliter/want-to-keep-kids-safe-online-teach-them-how-the-internet-works-38bm</guid>
      <description>&lt;p&gt;We live in a world where children are growing up with more access to the internet than ever before—but with very little understanding of how it &lt;em&gt;actually&lt;/em&gt; works.&lt;/p&gt;

&lt;p&gt;We teach them how to use phones, tablets, and apps...&lt;br&gt;&lt;br&gt;
But what if the real safety net isn’t just parental controls—it’s &lt;strong&gt;digital literacy&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;I believe one of the best ways to protect children online is to &lt;strong&gt;teach them how the internet is built&lt;/strong&gt;—and that starts with &lt;strong&gt;learning to code&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 Understanding = Empowerment
&lt;/h3&gt;

&lt;p&gt;When kids learn the basics of how websites, web apps, and networks function, they gain more than technical skills.&lt;/p&gt;

&lt;p&gt;They learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What’s real vs. what’s manipulated&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to question what they see online&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Why security matters&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What personal information should (and should &lt;em&gt;not&lt;/em&gt;) be shared&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: &lt;strong&gt;they go from passive users to active thinkers.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🌍 Start With the Foundations
&lt;/h3&gt;

&lt;p&gt;You don’t have to wait until high school to teach the internet.&lt;/p&gt;

&lt;p&gt;Even younger kids can grasp the fundamentals of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;HTML (how structure is created)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CSS (how it looks)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JavaScript (how it works)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browsers, domains, IP addresses, links, cookies, and basic safety&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💡 Free Resources to Help Kids Learn the Internet
&lt;/h3&gt;

&lt;p&gt;Here are &lt;strong&gt;free, beginner-friendly platforms&lt;/strong&gt; that make it fun and accessible:&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ &lt;a href="https://www.w3schools.com" rel="noopener noreferrer"&gt;W3Schools&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Simple, clean, interactive. A great way for kids (and adults) to test out HTML, CSS, and JS with zero setup.&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ &lt;a href="https://www.freecodecamp.org" rel="noopener noreferrer"&gt;FreeCodeCamp&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Step-by-step learning with real-world projects. Their "Responsive Web Design" and "JavaScript Algorithms" sections are gold.&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ &lt;a href="https://www.sololearn.com" rel="noopener noreferrer"&gt;Sololearn&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Interactive mobile learning. Great for kids who love gamified experiences with bite-sized coding lessons.&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ &lt;a href="https://csfirst.withgoogle.com" rel="noopener noreferrer"&gt;CS First by Google&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Aimed at younger students (grades 4–8), using Scratch to teach coding in a visual, story-based format.&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ &lt;a href="https://learning.mozilla.org/en-US/web-literacy" rel="noopener noreferrer"&gt;The Web Literacy Map (by Mozilla)&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;A fantastic breakdown of core web concepts: from understanding URLs to building trustworthy content.&lt;/p&gt;




&lt;h3&gt;
  
  
  👨‍👩‍👧 Tech Isn’t the Enemy—Ignorance Is
&lt;/h3&gt;

&lt;p&gt;We can’t shield kids from every corner of the internet. But we &lt;em&gt;can&lt;/em&gt; equip them to understand what they’re seeing and how things work behind the scenes.&lt;/p&gt;

&lt;p&gt;When kids learn to code, they don’t just become tech-savvy—they become more &lt;strong&gt;confident, critical, and curious&lt;/strong&gt; about the world they’re growing up in.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 Let’s Talk
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;How are you teaching your kids (or students) about the internet?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What age do you think is right to introduce coding?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What tools or platforms helped &lt;em&gt;you&lt;/em&gt; understand how the web works?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we want a smarter, safer internet for the next generation—&lt;strong&gt;we need to start teaching them how it’s built.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>digitalliteracy</category>
      <category>kidswhocode</category>
      <category>internetsafety</category>
      <category>codingforkids</category>
    </item>
    <item>
      <title>W3Schools Still Slaps — Here's Why I Keep Coming Back to It</title>
      <dc:creator>John Liter</dc:creator>
      <pubDate>Mon, 23 Jun 2025 12:33:09 +0000</pubDate>
      <link>https://dev.to/realjohnliter/w3schools-still-slaps-heres-why-i-keep-coming-back-to-it-58o9</link>
      <guid>https://dev.to/realjohnliter/w3schools-still-slaps-heres-why-i-keep-coming-back-to-it-58o9</guid>
      <description>&lt;p&gt;Photo is a snippet from &lt;a href="https://www.w3schools.com" rel="noopener noreferrer"&gt;W3 Schools&lt;/a&gt;: &lt;/p&gt;

&lt;p&gt;There’s this unspoken idea in developer circles that once you reach a certain level, you should stop using sites like &lt;strong&gt;W3Schools&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But let me be real with you—I still use it. &lt;strong&gt;A lot.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And honestly?&lt;br&gt;&lt;br&gt;
I don’t just use it…&lt;br&gt;&lt;br&gt;
&lt;strong&gt;I recommend it.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 It's Not Fancy. It's Fast.
&lt;/h3&gt;

&lt;p&gt;W3Schools isn’t trying to impress you with animations, AI chat, or deep dives into obscure frameworks. What it &lt;em&gt;does&lt;/em&gt; do is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Here’s how to do the thing you forgot how to do.”&lt;br&gt;&lt;br&gt;
Clear. Simple. To the point.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I don’t need a YouTube course to remind me how &lt;code&gt;flex-grow&lt;/code&gt; works or how to write a basic &lt;code&gt;onclick&lt;/code&gt; function.&lt;br&gt;&lt;br&gt;
I just need it &lt;em&gt;now&lt;/em&gt;. W3 delivers.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ It’s Perfect for the "I Know This... But I Forgot" Moments
&lt;/h3&gt;

&lt;p&gt;You know that feeling—you’re working on something more advanced, but your brain blanks on a basic syntax or method. It happens to all of us.&lt;/p&gt;

&lt;p&gt;That’s when I hit W3Schools.&lt;/p&gt;

&lt;p&gt;It’s my mental Post-it note.&lt;br&gt;&lt;br&gt;
A quick refresher so I can keep building without going down a rabbit hole.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤝 It’s Not Just for Beginners—It’s for Builders
&lt;/h3&gt;

&lt;p&gt;People label W3Schools as a “beginner site.” But that’s not a downside. That’s a &lt;strong&gt;superpower&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When I’m deep into React or Node or wrangling a REST API, the last thing I want is to get lost in overcomplicated documentation.&lt;br&gt;&lt;br&gt;
Sometimes, the best way forward is just going &lt;strong&gt;back to the basics&lt;/strong&gt;—fast.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 My Take
&lt;/h3&gt;

&lt;p&gt;W3Schools is like that friend who never left your hometown.&lt;br&gt;&lt;br&gt;
They didn’t become flashy or trendy.&lt;br&gt;&lt;br&gt;
But when you come back for help—they’re &lt;em&gt;still there&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
Still solid. Still useful.&lt;/p&gt;




&lt;h3&gt;
  
  
  🙋‍♂️ I’m Curious:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Do you still use W3Schools when you need a quick syntax check?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What other go-to resources do you rely on for fast refreshers?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Why do you think devs sometimes feel weird admitting they use simple tools?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s normalize using &lt;strong&gt;what works&lt;/strong&gt;—not what looks good in a tweet.&lt;/p&gt;

&lt;p&gt;Because at the end of the day, building things matters more than impressing people with how you got there.&lt;/p&gt;

</description>
      <category>w3schools</category>
      <category>dailydev</category>
      <category>backtobasics</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Time, Code, and Chaos: What I’m Learning About Balance as a Developer</title>
      <dc:creator>John Liter</dc:creator>
      <pubDate>Sun, 22 Jun 2025 13:36:30 +0000</pubDate>
      <link>https://dev.to/realjohnliter/time-code-and-chaos-what-im-learning-about-balance-as-a-developer-132k</link>
      <guid>https://dev.to/realjohnliter/time-code-and-chaos-what-im-learning-about-balance-as-a-developer-132k</guid>
      <description>&lt;p&gt;Some days I feel unstoppable—deep in the zone, code flowing, tabs organized, energy locked in.&lt;/p&gt;

&lt;p&gt;Other days… it’s 4 PM, I’ve bounced between Slack, VS Code, Notion, and six Stack Overflow threads—and I can’t tell you what I actually &lt;em&gt;finished&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Being a developer comes with freedom. But no one talks enough about the pressure that freedom brings.&lt;/p&gt;

&lt;p&gt;Time is weird in this work.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 I’ve Learned That “Busy” Isn’t the Same as Productive
&lt;/h3&gt;

&lt;p&gt;I used to think being constantly active meant I was making progress.&lt;br&gt;&lt;br&gt;
But now, I catch myself asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What actually moved forward today?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Some days, the only real win was deleting code that no longer served a purpose—and that’s okay.&lt;/p&gt;




&lt;h3&gt;
  
  
  💻 Deep Work Is Rare… and Priceless
&lt;/h3&gt;

&lt;p&gt;There’s something powerful about a solid 2-hour coding window—no notifications, no background noise, just solving.&lt;/p&gt;

&lt;p&gt;Those moments don’t happen by accident. And they don’t happen every day.&lt;br&gt;&lt;br&gt;
But when they do, they remind me why I started coding in the first place.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔁 Routines Help, Until They Don’t
&lt;/h3&gt;

&lt;p&gt;I’ve tried Pomodoros, strict schedules, even time blocking.&lt;br&gt;&lt;br&gt;
Sometimes they work.&lt;br&gt;&lt;br&gt;
Other times, I need flexibility more than structure.&lt;/p&gt;

&lt;p&gt;The trick—for me, at least—is knowing &lt;em&gt;which version of me&lt;/em&gt; is showing up that day. And adjusting without guilt.&lt;/p&gt;




&lt;h3&gt;
  
  
  😮‍💨 I’ve Felt Burned Out from Doing “Too Much Nothing”
&lt;/h3&gt;

&lt;p&gt;Burnout doesn’t always come from shipping too much.&lt;/p&gt;

&lt;p&gt;Sometimes it comes from &lt;strong&gt;staring at the same problem too long&lt;/strong&gt;, getting nowhere, and losing the joy of the work.&lt;/p&gt;

&lt;p&gt;That’s when I step away. I don’t “quit”—I just give myself space to come back stronger.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧭 I Don’t Have It All Figured Out
&lt;/h3&gt;

&lt;p&gt;Some weeks I feel aligned. Others, I feel scattered.&lt;br&gt;&lt;br&gt;
But I’ve learned to check in with myself—not just my code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Am I creating, or just reacting today?”&lt;br&gt;&lt;br&gt;
“Am I learning, or just collecting tabs?”&lt;br&gt;&lt;br&gt;
“Do I feel behind—or just tired?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s made all the difference.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 I’m Curious
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;How do you manage your time without losing momentum?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Have you found a rhythm that works for you—or are you still figuring it out like me?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What makes you feel &lt;em&gt;in control&lt;/em&gt; of your time as a dev?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop your thoughts. Let’s talk about the messy, honest side of productivity—no hustle posts, no hacks, just real dev life.&lt;/p&gt;

</description>
      <category>developerlife</category>
      <category>timeandenergy</category>
      <category>dailydev</category>
      <category>burnoutisreal</category>
    </item>
    <item>
      <title>Encouragement Over Ego: Why Helping New Developers Is All of Our Responsibility</title>
      <dc:creator>John Liter</dc:creator>
      <pubDate>Fri, 20 Jun 2025 12:42:06 +0000</pubDate>
      <link>https://dev.to/realjohnliter/encouragement-over-ego-why-helping-new-developers-is-all-of-our-responsibility-42p0</link>
      <guid>https://dev.to/realjohnliter/encouragement-over-ego-why-helping-new-developers-is-all-of-our-responsibility-42p0</guid>
      <description>&lt;p&gt;Every day, I scroll through posts about React components, side projects, and coding journeys—some polished, some raw, some still figuring it out.&lt;/p&gt;

&lt;p&gt;And honestly? I love it.&lt;/p&gt;

&lt;p&gt;Not because every post is groundbreaking… but because &lt;strong&gt;every post is someone showing up&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You’ll see yet another calculator app, another to-do list clone, or a portfolio site with colors too bright to stare at for long. But behind every one of those posts is a &lt;em&gt;new developer&lt;/em&gt; trying to grow. Trying not to quit. Trying to matter.&lt;/p&gt;

&lt;p&gt;And that’s where &lt;strong&gt;we&lt;/strong&gt; come in.&lt;/p&gt;




&lt;h3&gt;
  
  
  👣 We’ve All Been There
&lt;/h3&gt;

&lt;p&gt;Whether you’ve been coding for 10 months or 10 years, you didn’t start by building full-stack SaaS platforms. You started with console logs, broken loops, and endless hours debugging things that seem trivial now.&lt;/p&gt;

&lt;p&gt;That’s why we can’t roll our eyes at beginner projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We were them.&lt;br&gt;&lt;br&gt;
And they will become us.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ❤️ Every Like Counts
&lt;/h3&gt;

&lt;p&gt;We underestimate how powerful small gestures are.&lt;/p&gt;

&lt;p&gt;A simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;"Great job!"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"Keep going!"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"Here’s a helpful article I used at that stage..."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Can &lt;strong&gt;completely change someone’s mindset&lt;/strong&gt;. It can be the difference between giving up and pushing through.&lt;/p&gt;

&lt;p&gt;Because let’s be real—early dev work is fragile. Not in code, but in &lt;em&gt;confidence&lt;/em&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧭 Feedback Is a Gift—If You Give It Right
&lt;/h3&gt;

&lt;p&gt;Being supportive doesn’t mean sugarcoating everything. Constructive feedback &lt;em&gt;is&lt;/em&gt; love—when delivered with care.&lt;/p&gt;

&lt;p&gt;Say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Your site looks clean! One suggestion: here’s a great article on accessible color contrast—could help sharpen the UX.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That shows you care about their &lt;strong&gt;growth&lt;/strong&gt;, not just your opinion.&lt;/p&gt;




&lt;h3&gt;
  
  
  🌱 Growth Starts With Recognition
&lt;/h3&gt;

&lt;p&gt;If we want stronger developers tomorrow, we need to nurture them today.&lt;/p&gt;

&lt;p&gt;Celebrate their small wins. Encourage them to publish. Show them the ropes. Remind them that progress is messy—and that’s okay.&lt;/p&gt;

&lt;p&gt;Because the next person who builds a breakthrough dev tool, or revolutionizes front-end workflows, or launches the best open-source tool of the year…&lt;br&gt;&lt;br&gt;
Might be that same new dev building their third to-do app right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let’s Talk 👇
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What’s the best encouragement you received early in your dev journey?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How do you give feedback that’s honest but uplifting?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What’s one piece of advice you wish someone gave you when you started?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s keep showing up for the next generation.&lt;br&gt;&lt;br&gt;
Not because we have to.&lt;br&gt;&lt;br&gt;
But because someone once did it for us.&lt;/p&gt;

</description>
      <category>mentorshipintech</category>
      <category>supportnewdevs</category>
      <category>developermindset</category>
      <category>dailydev</category>
    </item>
    <item>
      <title>Tools I Use as a Developer (And Why They Keep Me Growing)</title>
      <dc:creator>John Liter</dc:creator>
      <pubDate>Thu, 19 Jun 2025 12:52:13 +0000</pubDate>
      <link>https://dev.to/realjohnliter/tools-i-use-as-a-developer-and-why-they-keep-me-growing-30ee</link>
      <guid>https://dev.to/realjohnliter/tools-i-use-as-a-developer-and-why-they-keep-me-growing-30ee</guid>
      <description>&lt;p&gt;As developers, we don’t just write code—we build systems around our learning, creativity, and progress. Whether you're launching projects, writing docs, or sharpening your skills, the tools you choose can shape your entire journey.&lt;/p&gt;

&lt;p&gt;Here’s a quick look into the ecosystem I use every day to stay sharp, stay organized, and stay building 👇&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 &lt;strong&gt;Notion – My Digital Brain&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Notion is where everything lives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Coding notes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;College class takeaways&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Project ideas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Even random bug fixes I never want to forget&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s more than a notebook—it’s my &lt;strong&gt;developer journal&lt;/strong&gt;. Clean, flexible, and always evolving with me.&lt;/p&gt;




&lt;h3&gt;
  
  
  💻 &lt;strong&gt;GitHub – My Code Vault&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Every project, big or small, lives on GitHub.&lt;/p&gt;

&lt;p&gt;It’s not just for version control—it’s a portfolio, a backup plan, and a personal timeline of my evolution as a dev. I can look back and &lt;em&gt;see&lt;/em&gt; how far I’ve come, line by line.&lt;/p&gt;




&lt;h3&gt;
  
  
  🌐 &lt;strong&gt;daily.dev – My Learning Hub&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Every day, I log into &lt;a href="https://daily.dev" rel="noopener noreferrer"&gt;daily.dev&lt;/a&gt; to discover something new—&lt;br&gt;&lt;br&gt;
A framework breakdown, a Git trick I didn’t know, or a mindset shift from another dev’s blog.&lt;/p&gt;

&lt;p&gt;It’s not just a feed. It’s my &lt;strong&gt;launchpad for lifelong learning&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✍️ &lt;strong&gt;dev.to – Where I Share and Reflect&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I’ve started publishing articles on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;, and it’s become a place where I clarify what I learn by teaching others. I share those posts on daily.dev too, hoping to give back to the same community that’s helped me grow.&lt;/p&gt;

&lt;p&gt;Writing makes the knowledge stick—and helps someone else in the process.&lt;/p&gt;




&lt;h3&gt;
  
  
  🌐 &lt;strong&gt;Hostinger – My Web Publishing Engine&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I use Hostinger to host my business websites and personal projects.&lt;br&gt;&lt;br&gt;
Fast, clean, and beginner-friendly—I can deploy sites without overthinking infrastructure. That’s more time for &lt;strong&gt;building&lt;/strong&gt; and less time fighting DNS configs.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎬 &lt;strong&gt;Adobe Premiere Pro – For My YouTube Journey&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I just learned Adobe Premiere Pro, and now I’m creating content for my YouTube channel.&lt;/p&gt;

&lt;p&gt;Video editing felt overwhelming at first—but now it’s another way to express what I’ve built, learned, or want to teach. Sharing knowledge visually is powerful—and a new skill that’s already opening doors.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 What Tools Power Your Dev Journey?
&lt;/h2&gt;

&lt;p&gt;I’m curious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What’s your go-to app for organizing your brain?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which tools do you &lt;em&gt;actually&lt;/em&gt; use daily?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Have you started sharing your work—or are you waiting for it to be “perfect”?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you’re a full-stack veteran or just starting out, the tools you build with say a lot about how you’re growing. Let’s swap ideas and sharpen each other.&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>buildinpublic</category>
      <category>dailydev</category>
      <category>devjournal</category>
    </item>
  </channel>
</rss>
