<?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: Phillip A. Wessels</title>
    <description>The latest articles on Forem by Phillip A. Wessels (@pawper).</description>
    <link>https://forem.com/pawper</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%2F742648%2F9b26128e-5643-495a-a4e5-ffc67b18ca8c.jpeg</url>
      <title>Forem: Phillip A. Wessels</title>
      <link>https://forem.com/pawper</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pawper"/>
    <language>en</language>
    <item>
      <title>Containers &amp; Agents with Docker &amp; OpenClaw</title>
      <dc:creator>Phillip A. Wessels</dc:creator>
      <pubDate>Tue, 26 May 2026 22:36:12 +0000</pubDate>
      <link>https://forem.com/pawper/containers-agents-with-docker-openclaw-4pbd</link>
      <guid>https://forem.com/pawper/containers-agents-with-docker-openclaw-4pbd</guid>
      <description>&lt;p&gt;You have a fundamental problem in software: your code works on your machine, but breaks on someone else's. Different operating systems. Different versions of dependencies. Different configurations. "It works on my machine" is the oldest excuse in development.&lt;/p&gt;

&lt;p&gt;There's another problem too: packages. You install npm packages to build things faster. But what if a package has malicious code? What if it goes rogue and tries to access your system files? Without isolation, one bad package can compromise everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Containers solve both problems.&lt;/strong&gt; A container packages your application &lt;em&gt;plus everything it needs to run&lt;/em&gt;—the exact runtime, the exact dependencies, the exact configuration—into a single, portable unit. It also isolates your application in a sandbox: if a package misbehaves, it's confined to that container. It can't touch your other projects or your system files. The same container runs on your laptop, a colleague's Mac, and a production server. No surprises. No risk spillover.&lt;/p&gt;

&lt;p&gt;Docker is the standard tool for building and running containers. This guide teaches you what Docker does, how it works, and why it matters.&lt;/p&gt;

&lt;p&gt;Once you understand Docker, we can apply it as a solution for a specific problem: &lt;strong&gt;containing an agent&lt;/strong&gt;—OpenClaw—so it can run without accessing your entire system. We'll set that up, connect it to Discord, and you'll have deployed your first production system.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problems Containers Solve
&lt;/h2&gt;

&lt;p&gt;Imagine you're running an application on your laptop. It works fine. But then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your application depends on Python 3.11, but you upgrade to Python 3.12 for another project. Now the first application breaks.&lt;/li&gt;
&lt;li&gt;You want to deploy the application to a server. You install dependencies, but the server has a different OS version or different package versions. Things behave differently.&lt;/li&gt;
&lt;li&gt;Your application crashes. It stays down until you manually restart it.&lt;/li&gt;
&lt;li&gt;You install a sketchy npm package for one project. It misbehaves and starts corrupting files. It affects your entire system.&lt;/li&gt;
&lt;li&gt;You want to run the same application on Windows and macOS. You need different installation instructions for each platform. Developers always forget a step.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the problems containers solve:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reproducibility&lt;/strong&gt; — The same container runs identically on your laptop, a colleague's Mac, a staging server, and production. No "works on my machine" surprises. No platform-specific configuration nightmares.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Isolation&lt;/strong&gt; — Each container is sandboxed. One application's dependencies don't conflict with another's. A misbehaving package or crashed application or AI agent (like OpenClaw) is confined to its container—it can't damage your system or other projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reliability&lt;/strong&gt; — If an application crashes, the container can automatically restart it. Long-running services stay alive without manual intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment simplicity&lt;/strong&gt; — You don't install your application on a server. You just run the container. Same image, same behavior, everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Docker?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; is a containerization platform. It packages your application—plus everything it needs to run—into a single, portable unit. Think of it this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Without Docker&lt;/strong&gt; — You ship code to someone and say, "Install Node.js 24, npm 11, these 50 packages, and run this." Hope their setup matches yours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With Docker&lt;/strong&gt; — You ship a container. It includes Node.js 24, npm 11, all 50 packages, and your code. It runs identically everywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Mental Model: Images and Containers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A Docker image&lt;/strong&gt; is a blueprint—a template that describes how to build an environment. It's like a recipe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Docker container&lt;/strong&gt; is a running instance of that image. It's like baking a cookie from the recipe.&lt;/p&gt;

&lt;p&gt;You create one image. You can run multiple containers from it. Each container is isolated and independent.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Dockerfile: Your Recipe
&lt;/h2&gt;

&lt;p&gt;To build a Docker image, you write a &lt;code&gt;Dockerfile&lt;/code&gt;—a set of instructions. Here's an example:&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; node:24-slim&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; some-app
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PORT=3000&lt;/span&gt;
&lt;span class="k"&gt;VOLUME&lt;/span&gt;&lt;span class="s"&gt; ["/data"]&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["some-app", "start"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each instruction does something:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instruction&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FROM node:24-slim&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start with Node.js 24 (base OS + runtime)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WORKDIR /app&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create &lt;code&gt;/app&lt;/code&gt; directory (where your app lives)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RUN npm install -g some-app&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Install the application globally&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ENV PORT=3000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set an environment variable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;VOLUME ["/data"]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mark a directory for persistent storage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CMD ["some-app", "start"]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Default command to run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When Docker builds this, it creates layers. Layer 1 is Node.js. Layer 2 is the app. If you rebuild and only change the app, Docker reuses layer 1 from cache. It's fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker Compose: Orchestrating Containers
&lt;/h2&gt;

&lt;p&gt;Real applications need more than just a Dockerfile. You need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set environment variables&lt;/li&gt;
&lt;li&gt;Mount persistent storage&lt;/li&gt;
&lt;li&gt;Handle restarts&lt;/li&gt;
&lt;li&gt;Configure networking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt; is a tool that manages all this. You write a &lt;code&gt;compose.yaml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;myapp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-data:/data&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PORT=3000&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app-data&lt;/span&gt;&lt;span class="pi"&gt;:&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;Build the image from the Dockerfile in this directory&lt;/li&gt;
&lt;li&gt;If the container crashes, restart it automatically&lt;/li&gt;
&lt;li&gt;Mount persistent storage at &lt;code&gt;/data&lt;/code&gt; (survives restarts)&lt;/li&gt;
&lt;li&gt;Pass environment variables into the container&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compose is the orchestrator—it keeps your container running, manages storage, handles restarts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Persistent State: Volumes and Data
&lt;/h2&gt;

&lt;p&gt;Here's an important concept: &lt;strong&gt;containers are ephemeral by default.&lt;/strong&gt; When you stop a container, any data stored inside it is lost.&lt;/p&gt;

&lt;p&gt;This is actually a feature—it means containers are isolated and clean. But for applications that need to remember things (databases, agent configurations, user data), you need persistence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Volumes&lt;/strong&gt; are Docker's solution. A volume is a storage location outside the container that survives restarts. When you mount a volume in a container, it can read and write data that persists even after the container stops.&lt;/p&gt;

&lt;p&gt;In your &lt;code&gt;compose.yaml&lt;/code&gt;, you define volumes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;openclaw-workspace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then mount them in your container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;openclaw-workspace:/workspace&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells Docker: "Create a persistent storage called &lt;code&gt;openclaw-workspace&lt;/code&gt;, and mount it at &lt;code&gt;/workspace&lt;/code&gt; inside the container." When the container stops, the data stays. When you restart the container, it reconnects to the same volume and picks up where it left off.&lt;/p&gt;

&lt;p&gt;This is how your agent remembers things between restarts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker Hub: The Registry Pattern (Again)
&lt;/h2&gt;

&lt;p&gt;Remember NPM Registry? Docker Hub follows the same pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Hub&lt;/strong&gt; is a registry of pre-built container images. When you write &lt;code&gt;FROM node:24-slim&lt;/code&gt;, Docker automatically downloads that image from Hub.&lt;/p&gt;

&lt;p&gt;You can push your own images to Docker Hub:&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; yourname/myapp:1.0 &lt;span class="nb"&gt;.&lt;/span&gt;
docker push yourname/myapp:1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anyone in the world can then run your container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run yourname/myapp:1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is how applications are distributed in the modern world—not as source code, but as ready-to-run containers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Install Docker
&lt;/h2&gt;

&lt;p&gt;You need Docker Desktop running on your machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows (with WSL):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download: &lt;a href="https://docs.docker.com/desktop/setup/install/windows-install/" rel="noopener noreferrer"&gt;https://docs.docker.com/desktop/setup/install/windows-install/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Run the installer. Keep "Use WSL 2 instead of Hyper-V" checked.&lt;/li&gt;
&lt;li&gt;Reboot if prompted.&lt;/li&gt;
&lt;li&gt;Launch Docker Desktop from the Start Menu.&lt;/li&gt;
&lt;li&gt;In Docker Desktop: &lt;strong&gt;Settings → Resources → WSL Integration&lt;/strong&gt; → enable Ubuntu.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download: &lt;a href="https://docs.docker.com/desktop/setup/install/mac-install/" rel="noopener noreferrer"&gt;https://docs.docker.com/desktop/setup/install/mac-install/&lt;/a&gt; (choose your chip: Apple Silicon or Intel)&lt;/li&gt;
&lt;li&gt;Open the &lt;code&gt;.dmg&lt;/code&gt; and drag Docker to Applications.&lt;/li&gt;
&lt;li&gt;Launch Docker from Applications.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Linux:&lt;/strong&gt;&lt;br&gt;
Follow your distribution's guide: &lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;https://docs.docker.com/engine/install/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify it's working:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You should see "Hello from Docker!" — you're good.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why OpenClaw in a Container?
&lt;/h2&gt;

&lt;p&gt;OpenClaw is an AI agent. It's autonomous. It thinks, decides, and takes actions without you telling it each step. You could run it directly on your machine, but here's the problem: &lt;strong&gt;an autonomous agent with full access to your system is dangerous.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you give OpenClaw permission to access your file system, it could read, modify, or delete files. If you give it access to your email or social media, it could send messages on your behalf. If it misbehaves, or if there's a bug in its reasoning, it could compromise your data or damage your system.&lt;/p&gt;

&lt;p&gt;You don't want an autonomous agent running freely with full system access. You want it &lt;strong&gt;contained&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A container provides a sandbox:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenClaw runs in an isolated environment. It can't access your file system, your other projects, or your personal data unless you explicitly give it permission.&lt;/li&gt;
&lt;li&gt;If OpenClaw misbehaves or causes damage, it's confined to the container. Your system stays safe.&lt;/li&gt;
&lt;li&gt;You control exactly what OpenClaw has access to (a specific folder, a specific API key, Discord) through configuration.&lt;/li&gt;
&lt;li&gt;If something goes wrong, you destroy the container and start fresh. Your system is unaffected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why containers are essential for running autonomous agents safely. Containers let you run powerful systems—agents, untrusted code, experimental software—without putting your data at risk.&lt;/p&gt;

&lt;p&gt;OpenClaw in a container means: powerful, but bounded.&lt;/p&gt;




&lt;h2&gt;
  
  
  Create Your OpenClaw Project
&lt;/h2&gt;

&lt;p&gt;Set up a working directory:&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;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/projects/openclaw
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/openclaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;Dockerfile&lt;/code&gt;:&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;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Dockerfile &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
FROM node:24-slim

WORKDIR /openclaw

RUN npm install -g openclaw@latest

ENV OPENCLAW_WORKSPACE=/workspace

VOLUME ["/workspace"]

CMD ["openclaw", "onboard"]
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FROM node:24-slim&lt;/code&gt; — Start with Node.js 24&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WORKDIR /openclaw&lt;/code&gt; — OpenClaw lives in &lt;code&gt;/openclaw&lt;/code&gt; inside the container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RUN npm install -g openclaw@latest&lt;/code&gt; — Install OpenClaw via npm (happens once, at build)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ENV OPENCLAW_WORKSPACE=/workspace&lt;/code&gt; — Tell OpenClaw where to store config&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VOLUME ["/workspace"]&lt;/code&gt; — Persistent storage—survives container restarts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CMD ["openclaw", "onboard"]&lt;/code&gt; — Default command: run onboarding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create a &lt;code&gt;compose.yaml&lt;/code&gt;:&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;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; compose.yaml &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
services:
  openclaw:
    build: .
    container_name: openclaw
    restart: unless-stopped
    volumes:
      - openclaw-workspace:/workspace
    environment:
      - OPENCLAW_WORKSPACE=/workspace
    stdin_open: true
    tty: true

volumes:
  openclaw-workspace:
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cat&lt;/code&gt; command  —  outputs text. The &lt;code&gt;&amp;gt;&lt;/code&gt; redirects it to a file. The &lt;code&gt;&amp;lt;&amp;lt; 'EOF'&lt;/code&gt; means "read input until you see EOF"—so you can paste a multi-line block. If you mess up, press Ctrl+C to cancel.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;build: .&lt;/code&gt; — Build from the Dockerfile&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;restart: unless-stopped&lt;/code&gt; — Keep the container always-on; auto-restart if it crashes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;volumes:&lt;/code&gt; — Persistent storage for agent config and state&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stdin_open: true&lt;/code&gt; and &lt;code&gt;tty: true&lt;/code&gt; — Allow interactive terminal input during setup&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How OpenClaw's State Persists
&lt;/h3&gt;

&lt;p&gt;The key line is &lt;code&gt;volumes: - openclaw-workspace:/workspace&lt;/code&gt;. This tells Docker: "Create a persistent storage volume called &lt;code&gt;openclaw-workspace&lt;/code&gt; and mount it at &lt;code&gt;/workspace&lt;/code&gt; inside the container."&lt;/p&gt;

&lt;p&gt;When you run OpenClaw and it saves your configuration, memories, and state—that all goes into &lt;code&gt;/workspace&lt;/code&gt;. Because it's mounted as a volume, it survives container restarts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this means in practice:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You run the gateway and chat with your agent. It learns things, stores memories.&lt;/li&gt;
&lt;li&gt;You stop the container (Ctrl+C in the terminal).&lt;/li&gt;
&lt;li&gt;You restart the container later with &lt;code&gt;docker compose run --rm openclaw openclaw gateway run&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Your agent picks up exactly where it left off. All memories, config, state—intact.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The volume is persistent. The container is ephemeral. When you destroy the container and start a new one, they both connect to the same volume. Your agent's data is safe.&lt;/p&gt;

&lt;p&gt;This is why you don't lose your agent's state when the container restarts or crashes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get API Keys
&lt;/h2&gt;

&lt;p&gt;OpenClaw needs Claude to think. You need an Anthropic API key.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://console.anthropic.com" rel="noopener noreferrer"&gt;https://console.anthropic.com&lt;/a&gt; and create an account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API Keys&lt;/strong&gt; → &lt;strong&gt;Create Key&lt;/strong&gt; → copy it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Billing&lt;/strong&gt; → add $5+&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;The API is pay-per-use, separate from Claude.ai. $5 lasts a while for personal use with Haiku.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Set Up Discord
&lt;/h2&gt;

&lt;p&gt;Your agent will chat remotely through Discord. Create a bot for it to control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First, create a Discord server&lt;/strong&gt; (if you don't have one already):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Discord (&lt;a href="https://discord.com" rel="noopener noreferrer"&gt;https://discord.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;+&lt;/strong&gt; icon on the left sidebar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create My Own&lt;/strong&gt; → give it a name (e.g., "OpenClaw Test") → Create&lt;/li&gt;
&lt;li&gt;You now have a private server where your agent will live&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Create the bot:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://discord.com/developers/applications" rel="noopener noreferrer"&gt;https://discord.com/developers/applications&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Application&lt;/strong&gt; → name it (e.g., "OpenClaw") → Create&lt;/li&gt;
&lt;li&gt;Left sidebar: &lt;strong&gt;Bot&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reset Token&lt;/strong&gt; → &lt;strong&gt;copy the token&lt;/strong&gt; (you won't see it again)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privileged Gateway Intents&lt;/strong&gt; → enable &lt;strong&gt;Message Content Intent&lt;/strong&gt; → Save&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Invite the bot to a server:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;OAuth2 → URL Generator&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Scopes: check &lt;strong&gt;bot&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Permissions: check &lt;strong&gt;Send Messages&lt;/strong&gt;, &lt;strong&gt;Read Message History&lt;/strong&gt;, &lt;strong&gt;View Channels&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copy the URL → paste in browser → select your server → Authorize&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You need a Discord server (even a private test one). Once the bot is in a server, you can DM it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build and Run Onboarding
&lt;/h2&gt;

&lt;p&gt;In 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;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/openclaw
docker compose build
docker compose run &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw openclaw onboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The build takes a few minutes the first time. Docker is downloading Node.js and OpenClaw. After that it's cached.&lt;/p&gt;

&lt;p&gt;The onboarding wizard will prompt you:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt&lt;/th&gt;
&lt;th&gt;Choose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Select channel&lt;/td&gt;
&lt;td&gt;Discord (Bot API)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discord bot token&lt;/td&gt;
&lt;td&gt;Paste from Part 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic auth method&lt;/td&gt;
&lt;td&gt;Anthropic API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API key&lt;/td&gt;
&lt;td&gt;Paste from Part 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-haiku-4-5-20251001&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web search&lt;/td&gt;
&lt;td&gt;DuckDuckGo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Install missing skill dependencies&lt;/td&gt;
&lt;td&gt;Skip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configure skills&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API keys (Google, Notion, etc.)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enable hooks&lt;/td&gt;
&lt;td&gt;Select &lt;code&gt;session-memory&lt;/code&gt;, skip rest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hatch in Terminal&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;On the model:&lt;/strong&gt; Haiku is fast and cheap—perfect for always-on. Switch to Sonnet later if needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On skills:&lt;/strong&gt; Don't install community skills yet. Get basics working first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Define Your Agent
&lt;/h2&gt;

&lt;p&gt;After onboarding, you define who your agent is. When prompted:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You are my personal AI assistant. I'm based in [city]. I'm a [background] focused on [goals]. Be direct, skip filler. Help me stay on top of tasks, research, and projects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This gets saved to &lt;code&gt;SOUL.md&lt;/code&gt; in your persistent volume. Edit it anytime to change how the agent behaves.&lt;/p&gt;




&lt;h2&gt;
  
  
  Start the Gateway
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;gateway&lt;/strong&gt; is the key to your agent listening to Discord. Here's what it does:&lt;/p&gt;

&lt;p&gt;Your agent needs to listen for messages. In Discord, messages come in. Your agent needs to respond. The gateway is the listening port—the connection between your agent and Discord. The agent is now listening to Discord 24/7. It receives messages, thinks, and responds.&lt;/p&gt;




&lt;h2&gt;
  
  
  Start Your Agent
&lt;/h2&gt;

&lt;p&gt;If you've already started a container and want to run the gateway (or restart it), don't use &lt;code&gt;docker compose run&lt;/code&gt; again—that would start a &lt;em&gt;new&lt;/em&gt; container. Instead, open another terminal window and use &lt;code&gt;docker exec&lt;/code&gt; to start the gateway in the existing container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec &lt;/span&gt;openclaw openclaw gateway run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This runs the gateway in the container that's already running, without creating a duplicate.&lt;/p&gt;

&lt;p&gt;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;[gateway] loading configuration...
[gateway] resolving authentication...
[gateway] connected
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your agent should now be live on Discord. Tag it and send it a message in the Discord channel it's in. It will respond.&lt;/p&gt;

&lt;p&gt;Leave this terminal open. Your agent stays connected as long as this process runs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Having trouble getting the gateway set up or navigating terminals?  You can insist OpenClaw do it for you -- and it can do it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Power and Danger of Agents
&lt;/h2&gt;

&lt;p&gt;Here's something important: your agent has direct access to its integrations. When you gave it your Discord bot token and your API key, you gave it authority to act on your behalf.&lt;/p&gt;

&lt;p&gt;This is powerful. Your agent can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up its own Discord channels&lt;/li&gt;
&lt;li&gt;Create reminders, manage tasks&lt;/li&gt;
&lt;li&gt;Fetch and analyze data&lt;/li&gt;
&lt;li&gt;Take actions autonomously&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;But be careful.&lt;/strong&gt; An agent with access to your API keys and authentication tokens can do a lot. If you give it permission to access your email, it can read and send emails. If you give it access to your file system, it can read and modify files.&lt;/p&gt;

&lt;p&gt;This is why agents need isolation (containers) and why you should audit what permissions you grant them.&lt;/p&gt;

&lt;p&gt;For now, you've only given OpenClaw access to Discord and the Anthropic API. That's safe.&lt;/p&gt;




&lt;h2&gt;
  
  
  You've Deployed a Production System
&lt;/h2&gt;

&lt;p&gt;You now have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A containerized application&lt;/strong&gt; — OpenClaw runs in an isolated container&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent storage&lt;/strong&gt; — Configuration and state survive restarts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic restarts&lt;/strong&gt; — If the agent crashes, the container restarts it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always-on operation&lt;/strong&gt; — The gateway keeps your agent listening 24/7&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure as code&lt;/strong&gt; — Your Dockerfile and &lt;code&gt;compose.yaml&lt;/code&gt; document everything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is real deployment. The same architecture scales to multiple agents, multiple servers, millions of interactions.&lt;/p&gt;

&lt;p&gt;You've moved from learning tools to building systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Daily Use: Running Your Agent
&lt;/h2&gt;

&lt;p&gt;Each time you start your machine, to start your agent:&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;cd&lt;/span&gt; ~/projects/openclaw
docker compose run &lt;span class="nt"&gt;--rm&lt;/span&gt; openclaw openclaw gateway run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Leave that terminal open. Open a new tab for other work.&lt;/p&gt;

&lt;h3&gt;
  
  
  macOS: Auto-Start on Login (Optional)
&lt;/h3&gt;

&lt;p&gt;To start your agent automatically when your Mac boots:&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;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/Library/LaunchAgents
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/Library/LaunchAgents/ai.openclaw.gateway.plist &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&amp;gt;
&amp;lt;plist version="1.0"&amp;gt;
&amp;lt;dict&amp;gt;
  &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;
  &amp;lt;string&amp;gt;ai.openclaw.gateway&amp;lt;/string&amp;gt;
  &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;
  &amp;lt;array&amp;gt;
    &amp;lt;string&amp;gt;/usr/local/bin/docker&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;compose&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;-f&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;/Users/YOUR_USERNAME/projects/openclaw/compose.yaml&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;run&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;--rm&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;openclaw&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;openclaw&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;gateway&amp;lt;/string&amp;gt;
    &amp;lt;string&amp;gt;run&amp;lt;/string&amp;gt;
  &amp;lt;/array&amp;gt;
  &amp;lt;key&amp;gt;RunAtLoad&amp;lt;/key&amp;gt;
  &amp;lt;true/&amp;gt;
  &amp;lt;key&amp;gt;KeepAlive&amp;lt;/key&amp;gt;
  &amp;lt;true/&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;YOUR_USERNAME&lt;/code&gt; with your Mac username. Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;launchctl load ~/Library/LaunchAgents/ai.openclaw.gateway.plist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To disable: &lt;code&gt;launchctl unload ~/Library/LaunchAgents/ai.openclaw.gateway.plist&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker: command not found&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Docker Desktop isn't running. Launch it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openclaw: command not found&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Expected—it's inside Docker. Use &lt;code&gt;docker compose run&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gateway says "Missing config"&lt;/td&gt;
&lt;td&gt;Config wasn't saved. Re-run: &lt;code&gt;docker compose run --rm openclaw openclaw onboard&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discord bot not responding&lt;/td&gt;
&lt;td&gt;Check &lt;strong&gt;Message Content Intent&lt;/strong&gt; is enabled in Discord Developer Portal.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Onboarding starts fresh every time&lt;/td&gt;
&lt;td&gt;Workspace volume isn't being used. Verify &lt;code&gt;ENV OPENCLAW_WORKSPACE=/workspace&lt;/code&gt; in Dockerfile and rebuild.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;(Windows WSL) Docker can't find files&lt;/td&gt;
&lt;td&gt;Keep files in WSL home (&lt;code&gt;~/&lt;/code&gt;), not Windows side (&lt;code&gt;/mnt/c/&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;(macOS Apple Silicon) "Architecture" warnings&lt;/td&gt;
&lt;td&gt;Normal—emulated via Rosetta. Performance is fine.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sources / additional material:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.docker.com/" rel="noopener noreferrer"&gt;https://docs.docker.com/&lt;/a&gt; — Docker official documentation&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.docker.com/get-started/" rel="noopener noreferrer"&gt;https://docs.docker.com/get-started/&lt;/a&gt; — Docker getting started&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.docker.com/compose/" rel="noopener noreferrer"&gt;https://docs.docker.com/compose/&lt;/a&gt; — Docker Compose&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hub.docker.com/" rel="noopener noreferrer"&gt;https://hub.docker.com/&lt;/a&gt; — Docker Hub registry&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/openclaw/openclaw" rel="noopener noreferrer"&gt;https://github.com/openclaw/openclaw&lt;/a&gt; — OpenClaw repository&lt;/p&gt;

&lt;p&gt;&lt;a href="https://console.anthropic.com" rel="noopener noreferrer"&gt;https://console.anthropic.com&lt;/a&gt; — Anthropic Console&lt;/p&gt;

&lt;p&gt;&lt;a href="https://discord.com/developers/applications" rel="noopener noreferrer"&gt;https://discord.com/developers/applications&lt;/a&gt; — Discord Developer Portal&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article was generated with AI for the purpose of providing practical information. I have reviewed it and edited it appropriately.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>containers</category>
      <category>agents</category>
      <category>openclaw</category>
    </item>
    <item>
      <title>All About AI &amp; Using Claude</title>
      <dc:creator>Phillip A. Wessels</dc:creator>
      <pubDate>Tue, 26 May 2026 22:35:25 +0000</pubDate>
      <link>https://forem.com/pawper/all-about-ai-using-claude-385e</link>
      <guid>https://forem.com/pawper/all-about-ai-using-claude-385e</guid>
      <description>&lt;p&gt;AI tools are fundamentally changing what developers can build -- and who can be a developer.&lt;/p&gt;

&lt;p&gt;Large Language Models (LLMs) and AI are no longer science fiction. They're tools in your hands, right now. But like any powerful tool, they require understanding: what they are, how to use them, and what their limitations are.&lt;/p&gt;

&lt;p&gt;This isn't about becoming an AI expert. It's about understanding the landscape, recognizing the tools available to you, and learning to work with them effectively. By the end of this article, you'll understand LLMs, the Claude ecosystem, and how to start using these tools in your workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Machine Learning?
&lt;/h2&gt;

&lt;p&gt;Machine Learning (ML) is the field where computers learn patterns from data instead of being explicitly programmed.&lt;/p&gt;

&lt;p&gt;Traditional programming: You write rules. The computer follows them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if temperature &amp;gt; 80:
    turn on AC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Machine Learning: You show the computer examples. It learns the pattern.&lt;br&gt;
&lt;strong&gt;Input:&lt;/strong&gt; temperature readings + AC on/off history&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; Model learns to predict when AC should be on&lt;/p&gt;

&lt;p&gt;The computer doesn't have explicit rules; it's learned patterns from data. This is powerful because patterns are everywhere, and humans can't always articulate them. Machine Learning finds them automatically.&lt;/p&gt;
&lt;h2&gt;
  
  
  What are Large Language Models?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Large Language Model (LLM)&lt;/strong&gt; is a type of AI trained on vast amounts of text data to predict and generate language.&lt;/p&gt;

&lt;p&gt;Here's the core idea: LLMs learned by reading billions of examples of human language. They've internalized patterns about how language works—not consciously, but as mathematical patterns. When you ask them a question, they predict what text should come next, word by word, based on those patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; LLMs don't "understand" in the way humans do. They're incredibly good at pattern recognition and prediction. But that pattern recognition is so sophisticated that it produces surprisingly intelligent output.&lt;/p&gt;

&lt;p&gt;Think of it like this: If you've read thousands of novels, you can predict what comes next in a story. You've internalized patterns. LLMs have done this with vastly more data and mathematical precision.&lt;/p&gt;
&lt;h2&gt;
  
  
  How Do LLMs Actually Work?
&lt;/h2&gt;

&lt;p&gt;You don't need to understand the mathematics. But here's the conceptual flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Training&lt;/strong&gt; — The model reads billions of words from the internet, books, code, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern learning&lt;/strong&gt; — It learns statistical patterns about language (what words follow other words, how to structure responses, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your prompt&lt;/strong&gt; — You ask it a question&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prediction&lt;/strong&gt; — The model predicts what text should come next, one word at a time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output&lt;/strong&gt; — Those predicted words form your answer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Key concept: Tokens&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LLMs work with "tokens"—small pieces of text (usually a few characters). When you write a prompt, it's converted to tokens. When you use an LLM, you pay based on tokens (input tokens + output tokens).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This matters because longer prompts cost more longer responses cost more.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  A Brief History: How We Got Here
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Milestone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2012&lt;/td&gt;
&lt;td&gt;Deep learning emerges as a powerful ML technique&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;Transformer architecture invented (the foundation for all modern LLMs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;BERT and GPT-1 launched (early language models)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;GPT-3 (OpenAI) shocks the world with its capabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;ChatGPT launches, bringing AI to the mainstream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;Claude 1 (Anthropic), GPT-4, Gemini, and others compete&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024–2026&lt;/td&gt;
&lt;td&gt;Frontier models become faster, cheaper, more capable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The arc: models got bigger (more parameters, more training data) and better at following instructions. AI went from research novelty to practical tool.&lt;/p&gt;
&lt;h2&gt;
  
  
  Frontier Models
&lt;/h2&gt;

&lt;p&gt;"Frontier models" just means the newest, most capable ones — the cutting edge.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Who Makes It&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Opus 4.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;The writer and coder. Produces the most natural-sounding writing and is a favorite among software developers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OpenAI (makers of ChatGPT)&lt;/td&gt;
&lt;td&gt;The reliable all-rounder. Great default choice if you want one tool that does a bit of everything well. Has the biggest ecosystem of apps and add-ons.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemini 3.1 Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;The brainiac. Especially strong at science and logic questions, and works smoothly with Google apps like Docs and Gmail.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grok 4.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;xAI (Elon Musk's company)&lt;/td&gt;
&lt;td&gt;The deep thinker. Aimed at really hard, expert-level questions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DeepSeek V4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DeepSeek (China)&lt;/td&gt;
&lt;td&gt;The budget champion. Very cheap to use, which matters a lot for businesses.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kimi K2.6 / GLM-5.1 / Qwen 3.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Various (mostly China)&lt;/td&gt;
&lt;td&gt;"Open" models you can download and run yourself. Increasingly competitive with the big closed ones.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Snapshot as of May 2026.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This field moves &lt;em&gt;fast&lt;/em&gt; — new models launch almost every week, and today's leader can be overtaken in a month. Don't stress about always having the "best" one. Pick something that works for you, and know that they're all improving constantly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Open vs. closed
&lt;/h2&gt;

&lt;p&gt;"Closed" models (like GPT-5.5) live on the company's servers — you rent access. "Open-weight" models can be downloaded and run on your own computer or servers, which appeals to businesses and tinkerers.&lt;/p&gt;
&lt;h2&gt;
  
  
  Business Models &amp;amp; Pricing
&lt;/h2&gt;

&lt;p&gt;These companies mostly earn money two ways: &lt;strong&gt;monthly subscriptions&lt;/strong&gt; for everyday people, and &lt;strong&gt;pay-as-you-go API access&lt;/strong&gt; for businesses building their own apps. As a beginner, you only care about the first one.&lt;/p&gt;

&lt;p&gt;The good news: nearly everyone has settled on the same simple ladder.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Real access to a capable model, with daily/weekly limits. Fine for trying things out.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standard (Plus/Pro)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$20/month&lt;/td&gt;
&lt;td&gt;The sweet spot. ChatGPT Plus, Claude Pro, and Google AI Pro all land at roughly $20 and unlock the flagship models plus higher limits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Premium / Max&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$100–$250/month&lt;/td&gt;
&lt;td&gt;For heavy daily users and professionals — much higher usage and extra perks like video generation. Most people don't need this.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A few helpful notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The big three all cost about the same&lt;/strong&gt; at the $20 tier, so price isn't really the deciding factor — pick based on which one you like using.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free tiers are genuinely good now.&lt;/strong&gt; Start there before paying for anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscriptions stack up fast.&lt;/strong&gt; Paying for ChatGPT &lt;em&gt;and&lt;/em&gt; Claude &lt;em&gt;and&lt;/em&gt; Gemini runs ~$60/month. Most beginners are happiest picking just one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"API pricing"&lt;/strong&gt; (those "$15 per million tokens" numbers) is for developers building software.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Try the free tiers of two or three for a week, then pay for the single one that earned its place. If you find yourself needing extra usage, consider upgrading your plan.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Cheaper/Free Alternatives
&lt;/h2&gt;

&lt;p&gt;The $20/month flagship plans aren't your only option. If cost matters, here are three ways to spend less — roughly from easiest to most technical.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Smaller models from the same companies.&lt;/strong&gt; Every big provider makes "mini" versions of their flagship — faster, cheaper, and still very capable for everyday tasks. Think Claude Haiku, GPT mini-tier, and Gemini Flash. They handle routine writing, summarizing, and Q&amp;amp;A at a tiny fraction of the flagship cost, and you'll often find them in the free tiers of the chat apps. For most casual use, these are plenty.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third-party "model hosting" providers.&lt;/strong&gt; Companies like Nebius, Together.ai, Groq, DeepInfra, and OpenRouter don't build their own models — they run open-source ones (Llama, Qwen, DeepSeek, and others) for you, usually much cheaper per use than the big labs. Note: these are mainly aimed at developers building apps, not casual chatbot users.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;| Provider | Specialty | Best for |&lt;br&gt;
  |---|---|---|&lt;br&gt;
  | &lt;strong&gt;Groq&lt;/strong&gt; | Speed | Ultra-fast inference |&lt;br&gt;
  | &lt;strong&gt;DeepInfra&lt;/strong&gt; | Cost | Cheapest rates |&lt;br&gt;
  | &lt;strong&gt;OpenRouter&lt;/strong&gt; | Flexibility | Switching between many models through one account |&lt;br&gt;
  | &lt;strong&gt;Nebius&lt;/strong&gt; | Privacy | Running inside Europe (data-privacy compliant) |&lt;br&gt;
  | &lt;strong&gt;Together.ai&lt;/strong&gt; | Open-source models | Building with Llama, Qwen, DeepSeek, and others |&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Local models — run AI on your own computer.&lt;/strong&gt; Free tools like Ollama and LM Studio let you download an open model (Llama, Gemma, Qwen, and similar) and run it entirely on your own machine. The upsides: it's free after setup, works offline, and nothing you type leaves your computer — great for privacy. The catches: you need a reasonably powerful computer, and these smaller local models aren't as sharp as the cloud-based frontier ones.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Rule of thumb:&lt;/strong&gt; Use a cheap "mini" model for everyday stuff, and only reach for an expensive flagship when a task is genuinely hard (tricky coding, deep reasoning, long documents). This "use the cheap one by default" approach is exactly how cost-conscious businesses keep their bills down.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  What Are AI Agents?
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;AI Agent&lt;/strong&gt; is an AI system that can autonomously perform tasks by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understanding a goal&lt;/li&gt;
&lt;li&gt;Breaking it into steps&lt;/li&gt;
&lt;li&gt;Taking actions (reading files, running code, making API calls)&lt;/li&gt;
&lt;li&gt;Observing results&lt;/li&gt;
&lt;li&gt;Adjusting and trying again&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Creator&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open-source&lt;/td&gt;
&lt;td&gt;"Operator" agent for personal productivity and automation. Grew from a weekend prototype to GitHub's most-starred repository, with a big marketplace of community-made skills.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hermes Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nous Research&lt;/td&gt;
&lt;td&gt;Learns your workflows over time. Markets itself as "the agent that grows with you" and recently surpassed OpenClaw as the most-used open-source agent by daily usage.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;Coding agent; a developer favorite for real software work.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Codex CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;OpenAI's command-line coding agent, in the same category as Claude Code.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GitHub/OpenAI&lt;/td&gt;
&lt;td&gt;AI pair programmer integrated into VS Code and other editors for coding assistance.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anysphere&lt;/td&gt;
&lt;td&gt;An AI-powered code editor (built on VS Code) with AI woven into every keystroke.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Snapshot as of May 2026.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This field moves &lt;em&gt;fast&lt;/em&gt; — new agents launch almost every week, and today's leader can be overtaken in a month. Don't stress about always having the "best" one. Pick something that works for you, and know that they're all improving constantly.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Basic Prompt Engineering
&lt;/h2&gt;

&lt;p&gt;You don't need to be an expert, but understanding a few patterns helps you get better results from models.&lt;/p&gt;
&lt;h3&gt;
  
  
  Pattern 1: Be Clear About Your Goal
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write something about Python
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write a beginner-friendly explanation of what Python lists are, with 2 code examples.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Specificity matters. The model can't read your mind.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 2: Provide Context
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fix this code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'm trying to read a CSV file and count rows. Here's my code:
[code]
It's giving an error: [error message]
What's wrong?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Context helps the model understand your actual problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 3: Ask for Structure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Tell me about Docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Explain Docker in these sections:
1. What problem does it solve?
2. How does it work conceptually?
3. What are the main concepts (images, containers, registries)?
4. Why is it useful for development?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Structure forces clarity on both sides.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pattern 4: Use Examples
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Bad:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Make this function better
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I want this function to be more readable. Here's an example of the style I like:
[example of clean code in your preferred style]
Now improve this function using that style:
[your function]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Examples communicate your preferences better than words.&lt;/p&gt;

&lt;h2&gt;
  
  
  Risks and Guardrails
&lt;/h2&gt;

&lt;p&gt;LLMs are powerful, but they have limitations and risks:&lt;/p&gt;

&lt;h3&gt;
  
  
  Hallucinations
&lt;/h3&gt;

&lt;p&gt;Models sometimes generates plausible-sounding but incorrect information. It might cite sources that don't exist or state facts that are wrong. &lt;strong&gt;Always verify important information.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Outdated Information
&lt;/h3&gt;

&lt;p&gt;A model's training data has a cutoff date. It doesn't know current events or recent changes. For up-to-date info, you need to provide context or use tools that can browse the web.&lt;/p&gt;

&lt;h3&gt;
  
  
  Biases
&lt;/h3&gt;

&lt;p&gt;LLMs learn from human-generated text, which contains biases. Models are generally trained to be helpful and harmless, but biases can still appear. &lt;strong&gt;Be aware of this, especially for sensitive decisions.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Security &amp;amp; Privacy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Don't share passwords, API keys, or sensitive credentials in prompts&lt;/li&gt;
&lt;li&gt;Don't assume your prompts are private (especially with free tiers)&lt;/li&gt;
&lt;li&gt;Treat conversations with LLMs as you would emails to a colleague&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Overreliance
&lt;/h3&gt;

&lt;p&gt;An LLM is a tool, not a replacement for human judgment. For important decisions, use models to help think, not to make the decision.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Claude Ecosystem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Claude&lt;/strong&gt; (the model) is made by &lt;strong&gt;Anthropic&lt;/strong&gt;, a company focused on building safe, reliable AI. When you use Claude, you're accessing their LLMs through various interfaces. I choose to start folks off with Claude because it's great for development -- and agency is about building your own tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude's Interfaces
&lt;/h3&gt;

&lt;p&gt;Claude is available through different tools, and you'll choose based on your use case:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What It Is&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Claude.ai&lt;/strong&gt; (Web)&lt;/td&gt;
&lt;td&gt;Chat interface in the browser — the classic way to use Claude&lt;/td&gt;
&lt;td&gt;Writing, research, analysis, brainstorming, everyday Q&amp;amp;A&lt;/td&gt;
&lt;td&gt;Free (with limits) / $20/mo Pro / $100–$200/mo Max&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Claude Desktop&lt;/strong&gt; (Mac/Windows)&lt;/td&gt;
&lt;td&gt;Standalone app — same chat as web, plus houses Cowork mode&lt;/td&gt;
&lt;td&gt;Same as web chat, but stays in your dock. Required for Cowork. Supports Dispatch (control from phone).&lt;/td&gt;
&lt;td&gt;Same subscription — Free, Pro, or Max&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Cowork&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Agentic mode inside Desktop — reads, writes, and organizes files on your computer&lt;/td&gt;
&lt;td&gt;Non-technical "get stuff done" work: organizing folders, building spreadsheets/decks/reports, multi-step file tasks. No terminal needed.&lt;/td&gt;
&lt;td&gt;Included with Pro ($20/mo), but heavy use burns tokens ~50–100× faster than chat — Max ($100/mo+) realistic for daily use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; (Terminal CLI)&lt;/td&gt;
&lt;td&gt;Command-line coding agent in your terminal&lt;/td&gt;
&lt;td&gt;Software engineering: writing, refactoring, debugging across multi-file codebases&lt;/td&gt;
&lt;td&gt;Pro ($20/mo) minimum. Max ($100–$200/mo) for heavy use. Or pay-per-token via API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Code VS Code / JetBrains Extension&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native IDE extension — Claude Code inside your editor&lt;/td&gt;
&lt;td&gt;Same coding tasks as CLI, but in a visual editor instead of raw terminal&lt;/td&gt;
&lt;td&gt;Bundled with your Claude subscription or API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Design&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI-powered visual canvas inside claude.ai — describe what you want, get interactive prototypes&lt;/td&gt;
&lt;td&gt;Prototypes, pitch decks, slides, one-pagers, UI mockups. Codebase-aware design systems. Hands off directly to Claude Code.&lt;/td&gt;
&lt;td&gt;No separate cost — shares existing Pro/Max/Team/Enterprise usage (research preview)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Claude in Chrome&lt;/strong&gt; (Beta)&lt;/td&gt;
&lt;td&gt;Browser extension — Claude can see, click, navigate, and fill forms in Chrome&lt;/td&gt;
&lt;td&gt;Automating repetitive browser tasks: data extraction, form filling, multi-site research. Pairs with Cowork.&lt;/td&gt;
&lt;td&gt;Included with paid plans. Pro gets Haiku only; Max/Team/Enterprise can pick Sonnet or Opus.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Anthropic API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pay-per-token developer API — build Claude into your own apps&lt;/td&gt;
&lt;td&gt;Developers embedding Claude in products, automating pipelines, running batch jobs. Full control, no UI.&lt;/td&gt;
&lt;td&gt;Haiku ~$0.80/$4 per 1M tokens, Sonnet $3/$15, Opus $15/$75. No monthly minimum.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Using Claude with Agents like OpenClaw
&lt;/h2&gt;

&lt;p&gt;Starting June 15, 2026 Claude subscribers will get a separate monthly "Agent SDK credit" for third-party tools like OpenClaw. The official page is here: &lt;a href="https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan" rel="noopener noreferrer"&gt;https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a beginner on a Pro plan who just wants to try OpenClaw with Claude right now:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're before June 15, 2026&lt;/strong&gt; — the Agent SDK credit hasn't kicked in yet. Your options today are to set up a pay-as-you-go API key at &lt;a href="https://console.anthropic.com" rel="noopener noreferrer"&gt;console.anthropic.com&lt;/a&gt;. You load a small amount of credit (even $5–$10 is enough to experiment), generate an API key, and plug that into OpenClaw's settings. You only pay for what you use — no commitment, no second subscription.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Once June 15 hits&lt;/strong&gt; — you can opt in to the $20/month Agent SDK credit from your Claude account, and OpenClaw will be able to authenticate through your subscription again. That $20 covers light use. If you burn through it mid-month, OpenClaw stops working until your next billing cycle (unless you enable overage billing, which charges API rates).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical advice for beginners:&lt;/strong&gt;&lt;br&gt;
Start with the API key approach even after June 15 — it's simpler to understand ("I put in $10, I use $10") and avoids surprises. Use &lt;strong&gt;Sonnet 4.6&lt;/strong&gt; as your model in OpenClaw, not Opus. It's 5× cheaper and handles most tasks just as well. Save Opus for things that genuinely need it.&lt;/p&gt;

&lt;p&gt;And honestly, if you're brand new to OpenClaw and just want to see what agents can do with Claude, the cheapest first step is to try &lt;strong&gt;Claude Code&lt;/strong&gt; in your terminal — it's already included with your Pro plan, no extra setup, and gives you a feel for agentic Claude before adding OpenClaw into the mix.&lt;/p&gt;


&lt;h2&gt;
  
  
  Understanding Claude Code (CLI)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; is a command-line interface that lets you use Claude directly from your terminal. It's designed for developers—Claude can read your code, suggest improvements, and even write and run code for you.&lt;/p&gt;

&lt;p&gt;Why is this relevant?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You'll use Claude Code in your workflow&lt;/li&gt;
&lt;li&gt;It's a practical example of how Claude integrates into development&lt;/li&gt;
&lt;li&gt;It shows how agents work (Claude understands your goal, suggests code, runs it)&lt;/li&gt;
&lt;li&gt;It bridges the gap between "Claude the AI" and "Claude the development tool"&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Why Claude Code Matters for What's Next
&lt;/h3&gt;

&lt;p&gt;When you learn &lt;strong&gt;Docker&lt;/strong&gt; (next), you'll use it to containerize applications. When you learn &lt;strong&gt;OpenClaw&lt;/strong&gt;, you'll use it to build autonomous agents. Both of these will interact with LLMs—potentially Claude.&lt;/p&gt;

&lt;p&gt;Claude Code is your first hands-on experience with that integration: an AI that can read code, understand your intent, and take action.&lt;/p&gt;


&lt;h2&gt;
  
  
  Setting Up and Using Claude Code
&lt;/h2&gt;

&lt;p&gt;Now let's get hands-on. Claude Code is a command-line tool that brings Claude into your terminal.&lt;/p&gt;
&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 18+ installed (you learned about this in the NPM article)&lt;/li&gt;
&lt;li&gt;A paid Claude subscription. Sign up for Claude Pro ($20/mo) or Max ($100–$200/mo) at claude.ai. The free tier doesn't include Claude Code.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Installtion
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Launch
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/your/project
claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now you can start conversing with Claude and working on files.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;On first launch you'll be prompted to authenticate in your browser. Choose the "Claude App" option and sign in with your Claude.ai account. Your credentials get stored — you only do this once.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Help
&lt;/h3&gt;

&lt;p&gt;Remember you can enter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see usage instructions. If you get "command not found," restart your terminal or check that npm installed it correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your First Claude Code Command
&lt;/h3&gt;

&lt;p&gt;Create a simple project:&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;mkdir &lt;/span&gt;my-claude-project
&lt;span class="nb"&gt;cd &lt;/span&gt;my-claude-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ask Claude Code to create a file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="s2"&gt;"Create a file called hello.txt with the text 'Hello, Claude!'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understand your request&lt;/li&gt;
&lt;li&gt;Suggest an approach&lt;/li&gt;
&lt;li&gt;Execute it&lt;/li&gt;
&lt;li&gt;Show you the result&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Congratulations—you've just used an AI agent from the command line.&lt;/p&gt;

&lt;h3&gt;
  
  
  More Examples
&lt;/h3&gt;

&lt;p&gt;Generate a simple Node.js script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="s2"&gt;"Write a Node.js script that reads a file and prints its contents"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get help with your code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="s2"&gt;"I have this function [paste code]. Why is it slow?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build something:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="s2"&gt;"Create a simple web server that responds with 'Hello World' on port 3000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code is a tool that gets better with practice. The more specific your requests, the better the results.&lt;/p&gt;




&lt;h2&gt;
  
  
  You're Now at the Frontier
&lt;/h2&gt;

&lt;p&gt;You've completed the Foundations of Digital Agency and stepped into the frontier of modern development. You understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Operating systems and terminals&lt;/li&gt;
&lt;li&gt;Code editors and development environments&lt;/li&gt;
&lt;li&gt;The command line and scripting&lt;/li&gt;
&lt;li&gt;Package management and registries&lt;/li&gt;
&lt;li&gt;Now: Large Language Models and AI tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's coming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; — Containerization and reproducibility&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw &amp;amp; Agents&lt;/strong&gt; — Building autonomous systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Applications&lt;/strong&gt; — Real-world development&lt;/li&gt;
&lt;li&gt;Beyond: Building your own solutions with AI as a partner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You now have the knowledge and the tools to claim agency. Not because you understand everything—nobody does. But because you understand enough to navigate, experiment, learn, and build.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sources / additional material:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://console.anthropic.com" rel="noopener noreferrer"&gt;https://console.anthropic.com&lt;/a&gt; — Claude API Console&lt;/p&gt;

&lt;p&gt;&lt;a href="https://claude.ai" rel="noopener noreferrer"&gt;https://claude.ai&lt;/a&gt; — Claude web interface&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.claude.com" rel="noopener noreferrer"&gt;https://code.claude.com&lt;/a&gt; — Claude Code documentation&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.anthropic.com/research" rel="noopener noreferrer"&gt;https://www.anthropic.com/research&lt;/a&gt; — Anthropic's research on AI safety&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openai.com/index/gpt-4/" rel="noopener noreferrer"&gt;https://openai.com/index/gpt-4/&lt;/a&gt; — GPT-4 information&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.google.dev/" rel="noopener noreferrer"&gt;https://ai.google.dev/&lt;/a&gt; — Google's AI tools&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article was generated with AI for the purpose of providing practical information. I have reviewed it and edited it appropriately.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>bash</category>
      <category>terminal</category>
    </item>
    <item>
      <title>On the Shoulders of Giants: Package Registries, Node &amp; NPM</title>
      <dc:creator>Phillip A. Wessels</dc:creator>
      <pubDate>Tue, 26 May 2026 22:35:18 +0000</pubDate>
      <link>https://forem.com/pawper/on-the-shoulders-of-giants-package-registries-node-npm-46m2</link>
      <guid>https://forem.com/pawper/on-the-shoulders-of-giants-package-registries-node-npm-46m2</guid>
      <description>&lt;p&gt;You've mastered the command line. You understand your operating system and your development environment. Now it's time to learn how modern developers leverage the work of others: through packages, registries, and package managers.&lt;/p&gt;

&lt;p&gt;Everything that comes next—Claude Code, Docker, OpenClaw, web applications—builds on the concepts you're about to learn. And at the center of all of it is a simple idea: &lt;strong&gt;reusable code, stored in a central place, installed with a single command&lt;/strong&gt;. This is where we leverage the power of the Internet and begin to see the open-source community come into play.&lt;/p&gt;

&lt;p&gt;Let's start with the why, then move to the how.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is a Package?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;package&lt;/strong&gt; (also called a module or library) is a collection of reusable code that someone else wrote, tested, and shared. Instead of writing authentication from scratch, you install a package that handles it. Instead of building a web server from the ground up, you install a package that does it for you.&lt;/p&gt;

&lt;p&gt;Packages can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Small utilities&lt;/strong&gt;: A function that formats dates, validates emails, or parses JSON&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large frameworks&lt;/strong&gt;: Complete systems for building web applications, managing databases, or running AI agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools and CLIs&lt;/strong&gt;: Command-line applications you run directly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Problem Do Registries Solve?
&lt;/h2&gt;

&lt;p&gt;Before registries, developers had to email code to each other, host code on personal websites, track versions manually, and hope dependencies didn't break. A &lt;strong&gt;registry&lt;/strong&gt; is a centralized, organized library where developers can publis* packages and others can install them. Think of it like an app store, but for code.&lt;/p&gt;

&lt;p&gt;The most famous registry nowadays is the &lt;strong&gt;NPM Registry&lt;/strong&gt;—the default home for JavaScript/Node.js packages. But the pattern appears everywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Hub&lt;/strong&gt; — Registry for container images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyPI&lt;/strong&gt; — Registry for Python packages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ClawHub&lt;/strong&gt; — Registry for OpenClaw AI agent configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What About GitHub?
&lt;/h2&gt;

&lt;p&gt;GitHub isn't a registry for packages, but it plays a similar role and is crucial in the ecosystem: it’s a code repository hosting platform (one of several) where developers store their source code using Git version control. Most open-source packages (NPM, Docker, etc.) have their source code hosted on GitHub. Developers also collaborate on code through GitHub. And, while you can also install packages directly from GitHub repos (&lt;code&gt;npm install github:username/repo&lt;/code&gt;), you'll also be able to clone many GitHub code repositories that are not packages, such as apps and projects. Like package registries, it's a vital way to build on the success of others.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Registries Work
&lt;/h2&gt;

&lt;p&gt;Here's the flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Developer writes code&lt;/strong&gt; (e.g., a useful function)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer publishes to registry&lt;/strong&gt; with a version number and metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You install from registry&lt;/strong&gt; with a single command: &lt;code&gt;npm install package-name&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registry delivers the code&lt;/strong&gt; to your project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You use the code&lt;/strong&gt; in your application&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. The registry is the middleman—a trusted place where packages live, versions are tracked, and installation is automatic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Risks You Need to Know
&lt;/h2&gt;

&lt;p&gt;Registries are powerful, but they come with responsibilities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Security Vulnerabilities&lt;/strong&gt;&lt;br&gt;
Packages can have bugs or security holes. A popular package with a vulnerability could affect thousands of projects. Always:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep packages updated (&lt;code&gt;npm update&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Check package reputation before installing&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;npm audit&lt;/code&gt; to find known vulnerabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Unmaintained Packages&lt;/strong&gt;&lt;br&gt;
A developer might stop maintaining a package. If it breaks or has a security issue, you're on your own. Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When was the last update?&lt;/li&gt;
&lt;li&gt;Is the repository active?&lt;/li&gt;
&lt;li&gt;How many people use it? (Popular = more eyes, more fixes)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Breaking Changes&lt;/strong&gt;&lt;br&gt;
New versions of packages might not work with your code. A seemingly small update could break your entire application. This is why &lt;strong&gt;versioning&lt;/strong&gt; matters (we'll cover this below).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Supply Chain Risk&lt;/strong&gt;&lt;br&gt;
If you install 10 packages, and each installs 5 more, you're now depending on 50+ packages. One vulnerability in any of them affects you. Be intentional about what you install.&lt;/p&gt;

&lt;p&gt;Further down we'll cover how to audit your packages.&lt;/p&gt;
&lt;h2&gt;
  
  
  How Packages Are Versioned
&lt;/h2&gt;

&lt;p&gt;Packages use &lt;strong&gt;semantic versioning&lt;/strong&gt; (semver): &lt;code&gt;MAJOR.MINOR.PATCH&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Example: &lt;code&gt;1.2.3&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1&lt;/strong&gt; (major) — Breaking changes. Code might not work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2&lt;/strong&gt; (minor) — New features, but backwards compatible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3&lt;/strong&gt; (patch) — Bug fixes only, always safe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you install a package, you specify which versions you're willing to accept:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;1.2.3&lt;/code&gt; — Exactly this version&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;^1.2.3&lt;/code&gt; — Any version up to &lt;code&gt;2.0.0&lt;/code&gt; (minor and patch updates okay)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;~1.2.3&lt;/code&gt; — Any version up to &lt;code&gt;1.3.0&lt;/code&gt; (patch updates only)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;*&lt;/code&gt; or &lt;code&gt;latest&lt;/code&gt; — Always the newest (risky!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your &lt;code&gt;package.json&lt;/code&gt; file tracks this, ensuring your project stays reproducible.&lt;/p&gt;


&lt;h2&gt;
  
  
  What is Node.js?
&lt;/h2&gt;

&lt;p&gt;JavaScript is one of the most accessible and widely-used programming languages. It's forgiving and relatively easy to learn. For decades, it only ran in browsers. Then Node.js arrived in 2009. &lt;strong&gt;Node.js&lt;/strong&gt; is a JavaScript runtime environment. It lets you run JavaScript on your computer, on servers, and in development tools.&lt;/p&gt;

&lt;p&gt;This means you can write or download JavaScript scripts and applications that run on your machine -- some as CLIs.&lt;/p&gt;

&lt;p&gt;Result: NPM (Node Package Manager) is now the largest package registry in the world (over 2 million packages). JavaScript developers could write reusable code once and share it. That accessibility cascaded into an ecosystem. This is why you'll see Node.js/JavaScript everywhere in development tools—from build systems to CLI tools to web servers.&lt;/p&gt;
&lt;h2&gt;
  
  
  Installing Node.js and NPM
&lt;/h2&gt;

&lt;p&gt;Node.js and NPM come together. When you install Node.js, you automatically get NPM.&lt;/p&gt;

&lt;p&gt;Download and install nvm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In lieu of restarting the shell:&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="se"&gt;\.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.nvm/nvm.sh"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Download and install Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the Node.js version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="c"&gt;# Should print "v24.16.0".&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify npm version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="c"&gt;# Should print "11.13.0".&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The above works on WSL and macOS (even though it says &lt;code&gt;bash&lt;/code&gt;). However, the version numbers above may become outdated; refer to the page below for the current version.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/en/download" rel="noopener noreferrer"&gt;https://nodejs.org/en/download&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Creating a Project: &lt;code&gt;npm init&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;We're not quite getting into projects yet, but when you start a new project, you initialize it with NPM:&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;mkdir &lt;/span&gt;my-project
&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
npm init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NPM asks questions about your project (name, description, author, etc.). Answer them or press Enter to accept defaults. This creates &lt;strong&gt;&lt;code&gt;package.json&lt;/code&gt;&lt;/strong&gt; — the most important file in your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding package.json
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt; is the contract for your project. It tells others (and future you):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What your project is&lt;/li&gt;
&lt;li&gt;What dependencies it needs&lt;/li&gt;
&lt;li&gt;What scripts it can run&lt;/li&gt;
&lt;li&gt;What version it is&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"My awesome project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo Building..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo Running tests..."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"express"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.18.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"axios"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.4.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"nodemon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.0.20"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key sections:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;scripts&lt;/code&gt;&lt;/strong&gt; — Commands you can run (&lt;code&gt;npm start&lt;/code&gt;, &lt;code&gt;npm run build&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;dependencies&lt;/code&gt;&lt;/strong&gt; — Packages your project needs to run&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;devDependencies&lt;/code&gt;&lt;/strong&gt; — Packages you only need during development (testing, build tools, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installing Packages
&lt;/h2&gt;

&lt;p&gt;Install a package with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ol&gt;
&lt;li&gt;Downloads &lt;code&gt;express&lt;/code&gt; from NPM Registry&lt;/li&gt;
&lt;li&gt;Adds it to &lt;code&gt;dependencies&lt;/code&gt; in &lt;code&gt;package.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Creates &lt;code&gt;node_modules/&lt;/code&gt; folder (contains the actual code)&lt;/li&gt;
&lt;li&gt;Creates &lt;code&gt;package-lock.json&lt;/code&gt; (locks exact versions for reproducibility)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Install a development-only package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; nodemon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This adds it to &lt;code&gt;devDependencies&lt;/code&gt; instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding node_modules
&lt;/h2&gt;

&lt;p&gt;When you install packages, NPM creates a &lt;code&gt;node_modules/&lt;/code&gt; folder. This folder contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The package you installed&lt;/li&gt;
&lt;li&gt;All of its dependencies&lt;/li&gt;
&lt;li&gt;All of &lt;em&gt;their&lt;/em&gt; dependencies&lt;/li&gt;
&lt;li&gt;And so on...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can get HUGE (hundreds of MB).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always commit &lt;code&gt;package.json&lt;/code&gt; and &lt;code&gt;package-lock.json&lt;/code&gt; to Git.&lt;/li&gt;
&lt;li&gt;Never commit &lt;code&gt;node_modules/&lt;/code&gt; — it's too large, so it should be in your &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When someone clones your project, they run &lt;code&gt;npm install&lt;/code&gt; and it rebuilds &lt;code&gt;node_modules&lt;/code&gt; from &lt;code&gt;package.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Updating Packages
&lt;/h2&gt;

&lt;p&gt;Check for outdated packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm outdated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update packages to their latest versions (respecting semver rules):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update a specific package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Caution:&lt;/strong&gt; Updating can introduce breaking changes. Always test after updating, and commit your work first so you can revert if needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running Scripts
&lt;/h2&gt;

&lt;p&gt;You define scripts in &lt;code&gt;package.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nodemon index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webpack"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jest"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run them with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
npm run dev
npm run build
npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scripts are shortcuts. &lt;code&gt;npm start&lt;/code&gt; is the same as running the command specified. This is why they're powerful—you can hide complex commands behind simple names.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Can I Audit My Packages for Security/Bugs?
&lt;/h2&gt;

&lt;p&gt;Security vulnerabilities in packages are inevitable. The good news: tools exist to help you manage them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manual audits with npm CLI:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you're working in your project locally, you can run &lt;code&gt;npm audit&lt;/code&gt; to check for known vulnerabilities in your packages. It scans against a database of known issues and suggests fixes. This is a manual check you do when you remember to do it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continuous monitoring (future):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you later learn about version control with GitHub, you'll discover a tool called &lt;strong&gt;Dependabot&lt;/strong&gt; that works alongside your package manager. Here's the idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your package manager (NPM) handles installation and updates&lt;/li&gt;
&lt;li&gt;Your code hosting platform (GitHub) can monitor your packages continuously&lt;/li&gt;
&lt;li&gt;Dependabot automatically scans for vulnerabilities, notifies you of issues, and suggests updates&lt;/li&gt;
&lt;li&gt;It never sleeps—it's checking your dependencies while you work on other things&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is an example of how tools in the ecosystem work together: one tool for packages, another for monitoring. You'll see this pattern throughout development—specialized tools doing specific jobs, all integrated together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For now:&lt;/strong&gt; Just know that security monitoring exists and is important. When you start working with version control and GitHub, you'll see how these tools connect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools Worth Knowing About
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;nvm&lt;/strong&gt; — Node Version Manager&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;18
nvm use 18
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Manage multiple Node.js versions. Useful when different projects need different versions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npx&lt;/strong&gt; — Run packages without installing globally&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-react-app my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Downloads and runs a package once, without installing it permanently. Great for one-off tools and generators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yarn&lt;/strong&gt; — Alternative to NPM&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn &lt;span class="nb"&gt;install
&lt;/span&gt;yarn add express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Different package manager with similar features. Some developers prefer it. For now, stick with NPM—they work the same way conceptually.&lt;/p&gt;




&lt;h2&gt;
  
  
  Registries: A Pattern You'll See Everywhere
&lt;/h2&gt;

&lt;p&gt;Here's the crucial connection:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NPM Registry&lt;/strong&gt; is a registry of &lt;strong&gt;packages&lt;/strong&gt; (JavaScript code).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Hub&lt;/strong&gt; is a registry of &lt;strong&gt;images&lt;/strong&gt; (containerized applications).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ClawHub&lt;/strong&gt; is a registry of &lt;strong&gt;AI skills&lt;/strong&gt; for OpenClaw.&lt;/p&gt;

&lt;p&gt;The pattern is identical:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Someone creates something useful&lt;/li&gt;
&lt;li&gt;They publish it to a registry with metadata and versioning&lt;/li&gt;
&lt;li&gt;You install it with a command&lt;/li&gt;
&lt;li&gt;You use it in your work&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You now understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What packages are and why they matter&lt;/li&gt;
&lt;li&gt;How registries work as central libraries&lt;/li&gt;
&lt;li&gt;The risks and how to manage them&lt;/li&gt;
&lt;li&gt;How to use NPM and manage dependencies&lt;/li&gt;
&lt;li&gt;That this pattern repeats everywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next we'll get into AI.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sources / additional material:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.npmjs.com/" rel="noopener noreferrer"&gt;https://docs.npmjs.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/en/docs/" rel="noopener noreferrer"&gt;https://nodejs.org/en/docs/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.npmjs.com/cli/v9/configuring-npm/package-json" rel="noopener noreferrer"&gt;https://docs.npmjs.com/cli/v9/configuring-npm/package-json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://semver.org/" rel="noopener noreferrer"&gt;https://semver.org/&lt;/a&gt; — Semantic Versioning specification&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.npmjs.com/downloading-and-installing-packages-locally" rel="noopener noreferrer"&gt;https://docs.npmjs.com/downloading-and-installing-packages-locally&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article was generated with AI for the purpose of providing practical information. I have reviewed it and edited it appropriately.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>bash</category>
      <category>node</category>
    </item>
    <item>
      <title>Commanding the Command Line</title>
      <dc:creator>Phillip A. Wessels</dc:creator>
      <pubDate>Tue, 26 May 2026 09:13:59 +0000</pubDate>
      <link>https://forem.com/pawper/commanding-the-command-line-2ei6</link>
      <guid>https://forem.com/pawper/commanding-the-command-line-2ei6</guid>
      <description>&lt;p&gt;You may experience some emotions of trepidation when staring at the empty prompt in the terminal.&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="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is very normal for beginners. But I want you to rewrite the story you're telling yourself from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ I am going to mess something up with this.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🚀 I am going to take off with this.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The command line does have deep functionality -- but it also has basics, and they're not complicated. By the time you finish this article, you'll understand those basics, and you can start to find your flow in the command line. Now let's get into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bash&lt;/strong&gt; (your shell if you're on Windows or Linux)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zsh&lt;/strong&gt; (your shell if you're on macOS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Either way, in the &lt;a href="http://pawper.dev/l/using-terminal-in-vs-code" rel="noopener noreferrer"&gt;VS Code integrated terminal&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  What does the command line do?
&lt;/h2&gt;

&lt;p&gt;The command line allows you to interact with the operating system through the shell in your terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use the command line interface (CLI) instead of a graphical user interface (GUI)?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It gives more control. There are things you can only do via the command line. &lt;/li&gt;
&lt;li&gt;Because typing is fast and you can also automate tasks, the command line is far quicker; the small gains in speed per task cumulate into a significant amount of efficiency.&lt;/li&gt;
&lt;li&gt;Compatibility; the command line will run on any machine, though &lt;a href="http://pawper.dev/l/installing-wsl-windows-subsystem-linux" rel="noopener noreferrer"&gt;Windows requires additional setup if you want to use the Unix command line&lt;/a&gt;. Cloud computing often requires the use of the command line. And, some AI tools are only available as CLIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What am I looking at?
&lt;/h2&gt;

&lt;p&gt;The first thing you see is the &lt;strong&gt;prompt&lt;/strong&gt;. The default composition of the prompt is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;currentuser@hostname:workingdirectoryUID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your prompt should look something like this if on WSL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;your-name@machine-name:/mnt/c/Users/your-name&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And not much different on macOS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;your-name@machine-name ~ %
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's &lt;code&gt;$&lt;/code&gt;/&lt;code&gt;%&lt;/code&gt;/&lt;code&gt;#&lt;/code&gt; mean in the prompt? What's &lt;code&gt;sudo&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;Before we go any further we have to talk about &lt;strong&gt;privileges&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The prompt has a UID indicator to remind you if your privileges are standard (&lt;code&gt;$&lt;/code&gt; - Bash; &lt;code&gt;%&lt;/code&gt; - Zsh) or root (&lt;code&gt;#&lt;/code&gt;). Root is not recommended. Anyone accessing your workstation (digitally or physically) could take advantage of or sabotage your system. If you see &lt;code&gt;#&lt;/code&gt; in the prompt, you should take it as a red flag.&lt;/p&gt;

&lt;p&gt;With standard privileges (&lt;code&gt;$&lt;/code&gt;/&lt;code&gt;%&lt;/code&gt;), you can temporarily gain administrative privileges by using the &lt;code&gt;sudo&lt;/code&gt; command. &lt;code&gt;sudo&lt;/code&gt; ("soo doo", short for "substitute user do") will prompt you for your user password, then for 5 minutes the Linux environment will run any command-line with the root privileges (in other words, all privileges). If you need to use &lt;code&gt;sudo&lt;/code&gt; for a command, you will receive a message stating something like "Permission denied."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Remember to store passwords securely.&lt;br&gt;
&lt;a href="http://pawper.dev/l/guide-password-management-cybersecurity-beginners" rel="noopener noreferrer"&gt;http://pawper.dev/l/guide-password-management-cybersecurity-beginners&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What's &lt;code&gt;~&lt;/code&gt;? Where am I?
&lt;/h2&gt;

&lt;p&gt;Your prompt shows the absoltue path from the root directory.&lt;/p&gt;

&lt;p&gt;Think of a path as instructions for how to navigate the file system. Every &lt;code&gt;/&lt;/code&gt; (Bash/Zsh's path separator) is a going from a directory into one of its contents. If you've spent time on Windows, you may be used to &lt;code&gt;\&lt;/code&gt; as the path separator, but you probably recognize &lt;code&gt;/&lt;/code&gt; as a path separator from URLs on the Internet.&lt;/p&gt;

&lt;p&gt;A path is an &lt;strong&gt;absolute path&lt;/strong&gt; if it gives directions all the way from the root (the other kind of path is a relative path, but we'll return to that in a bit).&lt;/p&gt;

&lt;p&gt;If you're in what's called the &lt;strong&gt;home directory&lt;/strong&gt; for your user profile, you'll see &lt;code&gt;~&lt;/code&gt;. In Bash/Zsh, home is represented by the metacharacter &lt;code&gt;~&lt;/code&gt;, and if you use it in the CLI, the shell just sees it as the absolute path of your home directory. So you can always return home by entering &lt;code&gt;cd ~&lt;/code&gt;! No ruby slippers required.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you're using WSL and in the mounted Windows filestystem, you'll see something like &lt;code&gt;/mnt/c/Users/your-name&lt;/code&gt; in the prompt. You should use &lt;code&gt;cd ~&lt;/code&gt; to change to your home directory in Linux. Stay on the Linux side of the fence!&lt;/p&gt;
&lt;/blockquote&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%2Fvley5fy8qc4nzxl2zubp.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%2Fvley5fy8qc4nzxl2zubp.png" alt="Anatomy of the Prompt (Generated by Claude Design)" width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What do I type here?
&lt;/h2&gt;

&lt;p&gt;You can submit a &lt;strong&gt;command-line&lt;/strong&gt; from the prompt. The general syntax is:&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;command&lt;/span&gt; &lt;span class="nt"&gt;-options&lt;/span&gt; arguments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Letter options follow a single dash and can be combined. For example, &lt;code&gt;-lh&lt;/code&gt;. Word options follow two dashes, such as &lt;code&gt;--help&lt;/code&gt;. Try the following commands as we go through them.&lt;/p&gt;

&lt;p&gt;Some commands are just a command/utility name, such as &lt;code&gt;clear&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clear
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Others take arguments:&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;echo &lt;/span&gt;hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Others accept letter options. Letter options are prefixed with a dash (&lt;code&gt;-&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ncal &lt;span class="nt"&gt;-3hMj&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some options might be longform word options (&lt;code&gt;--&lt;/code&gt;) and can't be combined in the above way.&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;df&lt;/span&gt; &lt;span class="nt"&gt;--human-readable&lt;/span&gt; &lt;span class="nt"&gt;--total&lt;/span&gt; &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ext4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to learn what options and arguments a command takes, use the &lt;code&gt;--help&lt;/code&gt; option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clear &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F4eub8y0cs1kidspl90f9.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%2F4eub8y0cs1kidspl90f9.png" alt="Anatomy of a Command Line (Generated by Claude Design)" width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Help, &lt;code&gt;--help&lt;/code&gt; isn't working!
&lt;/h2&gt;

&lt;p&gt;Enter:&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;history&lt;/span&gt; &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see it doesn't work.&lt;/p&gt;

&lt;p&gt;If  the option &lt;code&gt;--help&lt;/code&gt; doesn’t work, it’s a &lt;strong&gt;built-in&lt;/strong&gt;. Built-ins like &lt;code&gt;history&lt;/code&gt; are built into the shell (Bash/Zsh) and aren’t a standalone application executed from a file. They are processed faster and have a slightly different way of getting help &amp;amp; usage. Try passing them to other commands, like:&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;help history
&lt;/span&gt;info &lt;span class="nb"&gt;history
&lt;/span&gt;man &lt;span class="nb"&gt;history&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can determine if a command is a builtin or external program using the &lt;code&gt;type&lt;/code&gt; command:&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;type help
type history
type type&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How do I navigate the filesystem?
&lt;/h2&gt;

&lt;p&gt;When typing in the prompt, you can use absolute paths, but you'll usually use &lt;strong&gt;relative paths&lt;/strong&gt;. Relative paths begin at the current directory, represented by &lt;code&gt;.&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can type &lt;code&gt;..&lt;/code&gt; in the path to indicate a parent directory. So, &lt;code&gt;cd ../../..&lt;/code&gt; goes up 3 times in the filesystem.&lt;/p&gt;

&lt;p&gt;Note that Bash/Zsh are case-sensitive, and you'll need quotes around any paths with spaces in them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding the Root Directory
&lt;/h3&gt;

&lt;p&gt;You can start using &lt;code&gt;cd ..&lt;/code&gt; now to change directory up, but you should know -- The &lt;strong&gt;root directory&lt;/strong&gt; (represented as &lt;code&gt;/&lt;/code&gt;) is the top-level of your entire filesystem—the foundation from which all other directories branch out. It contains system files, configuration, and installed software that makes your operating system run. You'll rarely need to navigate here for your own work, but understanding what's there helps you navigate confidently and avoid dangerous mistakes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Caution:&lt;/strong&gt; Never delete or modify files in the root directory or its subdirectories unless you know exactly what you're doing. One wrong command with &lt;code&gt;rm&lt;/code&gt; can break your entire system. Always stay in your home directory (&lt;code&gt;~&lt;/code&gt;) for your work.&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%2F55ctmupv7cmknmyuegkm.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%2F55ctmupv7cmknmyuegkm.png" alt="The Filesystem &amp;amp; Paths (Generated by Claude Design)" width="799" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Commands for Navigating &amp;amp; Working with the Filesystem
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pwd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Print the working directory (where you are)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mkdir -p path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create directories in the path(s) within the working directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cd path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Change to the home directory (or specified path)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ls path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List the content of the working directory (or path)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;file file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Print what kind of file it is&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mv source destination&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Move &lt;code&gt;source&lt;/code&gt; to &lt;code&gt;destination&lt;/code&gt;; also used to rename files (e.g., &lt;code&gt;mv old.txt new.txt&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ln -s path link&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a symbolic link (nickname) for a file or directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cp file1 file2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a copy of &lt;code&gt;file1&lt;/code&gt; named &lt;code&gt;file2&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rm file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove the file; use &lt;code&gt;-r&lt;/code&gt; to remove directories recursively. &lt;strong&gt;⚠️ No undo!&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;locate x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Search for &lt;code&gt;x&lt;/code&gt; in the shell’s filesystem database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;updatedb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update the database that &lt;code&gt;locate&lt;/code&gt; uses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;pushd&lt;/code&gt; / &lt;code&gt;popd&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Save your location (&lt;code&gt;pushd&lt;/code&gt;); return to it (&lt;code&gt;popd&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;code .&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open the current directory in VS Code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;There is no undo. If you move, overwrite or delete a file or directory, it is a permanent change&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How do I make a new file?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Use When&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;touch filename.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You need a quick empty file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;echo "content" &amp;gt; filename.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You want to create a file with text in one command&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;cat &amp;gt; filename.txt&lt;/code&gt; then type content, Ctrl+D to save, Ctrl+C to cancel&lt;/td&gt;
&lt;td&gt;You want to type content interactively&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;code newfile.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You want to create and edit in VS Code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Naming files
&lt;/h3&gt;

&lt;p&gt;Capitalization matters and you should only use alphanumeric characters, hyphens and underscores. Other special characters cause issues, as they have special meaning to the operating system. Also avoid spaces because they are problematic; they do work if you put the filename in quotes (&lt;code&gt;'my website'&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Extensions
&lt;/h3&gt;

&lt;p&gt;A file can have a file type that doesn't match its extension and files technically work without an extension (however this is not recommended). Use the &lt;code&gt;file&lt;/code&gt; command to determine the actual file type.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I open / edit a file?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;code filename.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Edit in VS Code&lt;/strong&gt; — Best use this.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cat filename.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;View file&lt;/strong&gt; (read-only, printed to your terminal)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;less filename.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Page through file&lt;/strong&gt; (read-only) — View a file page-by-page.&lt;br&gt;Space to scroll, B to go back, Q to quit.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If you accidentally end up in a terminal text editor like nano or vim:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nano:&lt;/strong&gt; Press Ctrl+X to exit (it will ask to save)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vim:&lt;/strong&gt; Press Esc, then type &lt;code&gt;:q!&lt;/code&gt; (colon, q, exclamation) and press Enter to quit without saving&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Helpful Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Bash is case-sensitive. Most of the time the command-line will be lowercase.&lt;/li&gt;
&lt;li&gt;Use ↑ / ↓ to cycle through previous submissions.&lt;/li&gt;
&lt;li&gt;You can enter a list of commands separated by &lt;code&gt;;&lt;/code&gt; or &lt;code&gt;&amp;amp;&amp;amp;,&lt;/code&gt; all in one command line.&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;!!&lt;/code&gt; (“bang bang”) to repeat the previous command line.&lt;/li&gt;
&lt;li&gt;Right click with your mouse to paste.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Command Completion
&lt;/h3&gt;

&lt;p&gt;If you start typing a command, directory or file name, you can use command completion (a.k.a. auto completion) with the Tab key to have the shell to guess where you are trying to get to. If it isn’t working because there are multiple possibilities, press Tab twice to see a list of conflicting files:&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ cd Do&lt;/code&gt;Tab doesn’t autocomplete.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ cd Do&lt;/code&gt;TabTab prints the conflicts:&lt;br&gt;&lt;br&gt;
&lt;code&gt;Documents/ Downloads/&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ cd Doc&lt;/code&gt;Tab autocompletes to:&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ cd Documents/&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  WSL: converting Windows paths
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;wslpath&lt;/code&gt; is a CLI tool to convert Windows paths to Linux paths and vice-versa.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;WSL users: Should you ever need to, you can open the current directory in Windows Explorer by entering &lt;code&gt;explorer.exe .&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Beyond the Basics (Optional)
&lt;/h2&gt;

&lt;p&gt;Once you're comfortable with the fundamentals above, you can explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pipes (&lt;code&gt;|&lt;/code&gt;)&lt;/strong&gt; — Chain commands together: &lt;code&gt;cat file.txt | grep “search term”&lt;/code&gt; sends the output of one command into another&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redirection (&lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;)&lt;/strong&gt; — Save output to files: &lt;code&gt;ls &amp;gt; files.txt&lt;/code&gt; writes directory listing to a file; &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; appends&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;grep&lt;/code&gt;&lt;/strong&gt; — Search text: &lt;code&gt;grep “pattern” filename&lt;/code&gt; finds lines matching a pattern&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;find&lt;/code&gt;&lt;/strong&gt; — Advanced searching: &lt;code&gt;find . -name “*.js”&lt;/code&gt; finds all JavaScript files recursively&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;sed&lt;/code&gt; / &lt;code&gt;awk&lt;/code&gt;&lt;/strong&gt; — Text processing and manipulation for advanced workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tools unlock the real power of the command line, but they're not essential for getting started. Master the basics first, then explore these as you need them.&lt;/p&gt;
&lt;h3&gt;
  
  
  Permissions
&lt;/h3&gt;

&lt;p&gt;You can see files’ permissions using the &lt;code&gt;ls&lt;/code&gt; command with the long format argument (&lt;code&gt;-l&lt;/code&gt;). They are represented within a string of characters and dashes at the beginning of a file’s line.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;drwxr-xr-x 2 user user 4096 Jan  9 10:11 documents
-rw-r--r-- 1 user user  675 Jan  7 12:05 .profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;The first character indicates if the file is a directory or file. A &lt;code&gt;d&lt;/code&gt; indicates it is a directory. A &lt;code&gt;-&lt;/code&gt; indicates it is a file and is not a directory. The next 9 characters are the permissions.&lt;/li&gt;
&lt;li&gt;Every file or directory belongs to a user owner and a group owner. Then there are other people. Files can be readable (&lt;code&gt;r&lt;/code&gt;), writeable (&lt;code&gt;w&lt;/code&gt;) and/or executable (&lt;code&gt;x&lt;/code&gt;) for each, in that order. If you see a &lt;code&gt;-&lt;/code&gt; where one of these characters should be, that means the owner, group or public does not have that permission.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;chmod&lt;/code&gt; changes the mode/permissions of a file. You can optionally specify who for by using the corresponding letter for the owning user (&lt;code&gt;u&lt;/code&gt;), owning group (&lt;code&gt;g&lt;/code&gt;), and others (&lt;code&gt;o&lt;/code&gt;). Use &lt;code&gt;+&lt;/code&gt; to add a permission or &lt;code&gt;-&lt;/code&gt; to remove it. Then follow that with the applicable permission(s): &lt;code&gt;r&lt;/code&gt;, &lt;code&gt;w&lt;/code&gt; and/or &lt;code&gt;x&lt;/code&gt;. E.g., &lt;code&gt;chmod +x file&lt;/code&gt; (adds executable permission for all) or &lt;code&gt;chmod go-w file&lt;/code&gt; (removes write permission for the owning group and others).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh4kq2pummxsn4ksepxfy.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%2Fh4kq2pummxsn4ksepxfy.png" alt="File Permissions (Generated by Claude Design)" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Customize Your Prompt
&lt;/h2&gt;

&lt;p&gt;When you open Bash/Zsh in VS Code, your prompt might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;user@computer:/path/to/project&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can customize this by editing your &lt;code&gt;.bashrc&lt;/code&gt;/&lt;code&gt;.zshrc&lt;/code&gt; file (in your home directory):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;code ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add this near the bottom to create a simpler, colorful prompt:&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;export &lt;/span&gt;&lt;span class="nv"&gt;PS1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\[\0&lt;/span&gt;&lt;span class="s2"&gt;33[1;36m&lt;/span&gt;&lt;span class="se"&gt;\]&lt;/span&gt;&lt;span class="s2"&gt;→&lt;/span&gt;&lt;span class="se"&gt;\[\0&lt;/span&gt;&lt;span class="s2"&gt;33[0m&lt;/span&gt;&lt;span class="se"&gt;\]&lt;/span&gt;&lt;span class="s2"&gt; "&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or a prompt showing the current directory:&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;export &lt;/span&gt;&lt;span class="nv"&gt;PS1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\[\0&lt;/span&gt;&lt;span class="s2"&gt;33[1;32m&lt;/span&gt;&lt;span class="se"&gt;\]\w\[\0&lt;/span&gt;&lt;span class="s2"&gt;33[0m&lt;/span&gt;&lt;span class="se"&gt;\]&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\[\0&lt;/span&gt;&lt;span class="s2"&gt;33[1;36m&lt;/span&gt;&lt;span class="se"&gt;\]&lt;/span&gt;&lt;span class="s2"&gt;→&lt;/span&gt;&lt;span class="se"&gt;\[\0&lt;/span&gt;&lt;span class="s2"&gt;33[0m&lt;/span&gt;&lt;span class="se"&gt;\]&lt;/span&gt;&lt;span class="s2"&gt; "&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save with Ctrl+s.&lt;/p&gt;

&lt;p&gt;Reload your Bash configuration:&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;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Prompt Key
&lt;/h3&gt;

&lt;p&gt;Use these variables to build your custom prompt:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;What It Shows&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Current username&lt;/td&gt;
&lt;td&gt;✓ Keep it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\h&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hostname (computer name)&lt;/td&gt;
&lt;td&gt;✓ Keep it (useful for Docker)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\w&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full path of current directory&lt;/td&gt;
&lt;td&gt;Consider switching to &lt;code&gt;\W&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\W&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Base name of current directory only&lt;/td&gt;
&lt;td&gt;✓ Recommended (cleaner display)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\@&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Current time (12-hour am/pm format)&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\$&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shows &lt;code&gt;#&lt;/code&gt; if root user, otherwise &lt;code&gt;$&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;✓ Keep it (security indicator)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Color Codes
&lt;/h3&gt;

&lt;p&gt;To customize colors, find where you want the color to change and insert: &lt;code&gt;\[\033[X;Ym\]&lt;/code&gt; where &lt;code&gt;X;Y&lt;/code&gt; is the color code below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; &lt;code&gt;\[\033[1;36m\]→\[\033[0m\]&lt;/code&gt; makes the arrow bright cyan.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Color&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Color&lt;/th&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Black&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0;30&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Dark Gray&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1;30&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Red&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0;31&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Light Red&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1;31&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Green&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0;32&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Light Green&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1;32&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brown&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0;33&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Yellow&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1;33&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blue&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0;34&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Light Blue&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1;34&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Purple&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0;35&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Light Purple&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1;35&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cyan&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0;36&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Light Cyan&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1;36&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Light Gray&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0;37&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;White&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1;37&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Not all terminals support all colors. If using a terminal outside of VS Code, test and adjust if needed. &lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How to Escape Terminal Apps
&lt;/h3&gt;

&lt;p&gt;If you're stuck in a terminal application (like a text editor, pager, or hung process), here are the universal ways to escape:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Keyboard Shortcut&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+C
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Interrupt/Cancel&lt;/strong&gt; — Stops the current process. Works in most apps.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+D
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Exit&lt;/strong&gt; — Signals end-of-file. Closes some apps like &lt;code&gt;cat&lt;/code&gt; in input mode.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Quit&lt;/strong&gt; — Works in pagers like &lt;code&gt;less&lt;/code&gt; and &lt;code&gt;man&lt;/code&gt;. Just press Q.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+Z
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Suspend&lt;/strong&gt; — Pauses the app and returns to prompt (type &lt;code&gt;fg&lt;/code&gt; to resume, &lt;code&gt;bg&lt;/code&gt; to run in background).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Esc then &lt;code&gt;:q!&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Vim exit&lt;/strong&gt; — Press Esc, type &lt;code&gt;:q!&lt;/code&gt;, press Enter to force-quit without saving.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+X
&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Nano exit&lt;/strong&gt; — Exits to prompt (asks if you want to save).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;If nothing works:&lt;/strong&gt; Try Ctrl+C first. If that hangs, try Ctrl+Z. In VS Code's terminal, you can also close the terminal tab directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissions Denied When Running Scripts
&lt;/h3&gt;

&lt;p&gt;If you ever get a bash script, and you can't run it, use &lt;code&gt;chmod +x&lt;/code&gt;:&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;chmod&lt;/span&gt; +x ./script.sh
./script.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;chmod +x&lt;/code&gt; command makes the script executable.&lt;/p&gt;




&lt;p&gt;You are now in command of the command line. You can navigate the filesystem, manipulate files, run programs, and understand what's happening under the hood. That empty prompt that felt intimidating at the beginning? You know what to do with it now.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sources / additional material:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/docs/editor/command-line" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/editor/command-line&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article was revised &amp;amp; expanded with AI for the purpose of providing practical information. I have reviewed it for accuracy and edited it appropriately.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>bash</category>
      <category>wsl</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Using the Terminal in VS Code</title>
      <dc:creator>Phillip A. Wessels</dc:creator>
      <pubDate>Tue, 26 May 2026 09:12:03 +0000</pubDate>
      <link>https://forem.com/pawper/using-the-terminal-in-vs-code-1f3g</link>
      <guid>https://forem.com/pawper/using-the-terminal-in-vs-code-1f3g</guid>
      <description>&lt;p&gt;VS Code is technically an editor, not a full IDE (Integrated Development Environment). Unlike IDEs like Visual Studio or JetBrains products that bundle everything together, VS Code starts minimal and lets you add what you need. But here's where it gets interesting: features like the integrated &lt;a href="https://pawper.dev/l/operating-systems-terminals-shells#what-is-a-terminal" rel="noopener noreferrer"&gt;terminal&lt;/a&gt;, source control integration, debugging, and extensions blur that line significantly. By integrating tools into VS Code—especially the terminal—you're not adding bloat; you're building a customized developer experience tailored to your workflow.&lt;/p&gt;

&lt;p&gt;This is the power of VS Code: you control what you integrate. In this tutorial, you'll learn to use the integrated terminal to run commands, build projects, commit code, and debug applications—turning VS Code into an environment that feels more like an IDE without the overhead. As covered in &lt;a href="https://pawper.dev/l/operating-systems-terminals-shells" rel="noopener noreferrer"&gt;Part 1 of this series&lt;/a&gt;, understanding terminals and how they integrate into your workflow is foundational. Here, we'll make that integration practical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use the Terminal in VS Code?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem: Switching Between Windows
&lt;/h3&gt;

&lt;p&gt;Without an integrated terminal, you're constantly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Writing code in VS Code&lt;/li&gt;
&lt;li&gt;Switching to Terminal to run commands&lt;/li&gt;
&lt;li&gt;Switching back to VS Code to see the results&lt;/li&gt;
&lt;li&gt;Repeating this loop hundreds of times per day&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Context switching is awful for you. It's important that your developer experience is conducive to flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution: Integrated Terminal
&lt;/h3&gt;

&lt;p&gt;VS Code's integrated terminal runs &lt;strong&gt;inside your editor&lt;/strong&gt;. You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run commands without leaving VS Code&lt;/li&gt;
&lt;li&gt;See your code and terminal output at the same time&lt;/li&gt;
&lt;li&gt;Execute build commands, run tests, and start development servers with a few keystrokes&lt;/li&gt;
&lt;li&gt;Use the same terminal window for your entire development session&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Shell Should You Use?
&lt;/h2&gt;

&lt;p&gt;The integrated terminal in VS Code can run any shell installed on your system. Your choice depends on your operating system and setup:&lt;/p&gt;

&lt;h3&gt;
  
  
  On Windows
&lt;/h3&gt;

&lt;p&gt;Use &lt;strong&gt;bash&lt;/strong&gt; (from Ubuntu through WSL). This gives you a Unix-based development environment that matches your production servers and aligns with most tutorials. If you haven't already, &lt;a href="http://pawper.dev/l/installing-wsl-windows-subsystem-linux" rel="noopener noreferrer"&gt;install WSL&lt;/a&gt; and &lt;a href="http://pawper.dev/l/using-vs-code-with-wsl" rel="noopener noreferrer"&gt;configure VS Code to use it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;From here on we'll assume you're using Windows &amp;amp; VS Code with the Bash &lt;a href="http://pawper.dev/l/operating-systems-terminals-shells#what-is-a-shell" rel="noopener noreferrer"&gt;shell&lt;/a&gt; from WSL in your VS Code integrated terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  On macOS
&lt;/h3&gt;

&lt;p&gt;Use &lt;strong&gt;zsh&lt;/strong&gt; (default in modern macOS).&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up the Integrated Terminal
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Open the Integrated Terminal
&lt;/h3&gt;

&lt;p&gt;Open VS Code and press Ctrl+` (backtick, the key below Esc) to open the integrated terminal.&lt;/p&gt;

&lt;p&gt;Alternatively, go to &lt;strong&gt;View → Terminal&lt;/strong&gt; or right-click in the editor and select &lt;strong&gt;"Open in Integrated Terminal"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The terminal will open at the bottom of your editor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Windows Users: Ensure VS Code is remote connected with WSL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By default on Windows, VS Code opens terminals in PowerShell. But if you &lt;a href="http://pawper.dev/l/using-vs-code-with-wsl" rel="noopener noreferrer"&gt;have VS Code configured for WSL&lt;/a&gt;, the terminal should open with the Ubuntu (WSL) or Bash shell. If it opens to PowerShell, &lt;a href="http://localhost:4322/l/using-vs-code-with-wsl#opening-a-wsl-project-folder" rel="noopener noreferrer"&gt;ensure VS Code is remote connected with WSL&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 2: Create a New Terminal
&lt;/h3&gt;

&lt;p&gt;Close your current terminal (click the X) and open a new one with Ctrl+`.&lt;/p&gt;

&lt;p&gt;Verify by running:&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;echo&lt;/span&gt; &lt;span class="nv"&gt;$SHELL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see &lt;code&gt;/bin/bash&lt;/code&gt; (WSL) or &lt;code&gt;/bin/zsh&lt;/code&gt; (macOS).&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the Integrated Terminal
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basic Workflow
&lt;/h3&gt;

&lt;p&gt;Now that your terminal is set up, here's how you'll use it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open a project folder&lt;/strong&gt;: File → Open Folder, then select your project directory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open the terminal&lt;/strong&gt;: Ctrl+`
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run commands&lt;/strong&gt;: Type whatever you need (&lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;git commit&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;See output immediately&lt;/strong&gt;: Right above your code in the same window&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Multiple Terminals
&lt;/h3&gt;

&lt;p&gt;You can open multiple terminal tabs within the integrated terminal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New terminal&lt;/strong&gt;: Click the &lt;strong&gt;+&lt;/strong&gt; button in the terminal panel, or press Ctrl+Shift+`
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch between terminals&lt;/strong&gt;: Click the terminal name at the top, or use Ctrl+PageUp/PageDown to cycle through them&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split terminals&lt;/strong&gt;: Click the split icon (or right-click and select "Split Terminal") to run two terminals side-by-side&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running a development server in one terminal (&lt;code&gt;npm start&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Running tests in another (&lt;code&gt;npm test&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Having a third for git commands or other tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Terminal Shortcuts
&lt;/h3&gt;

&lt;p&gt;Learn these keyboard shortcuts to work faster:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+`
&lt;/td&gt;
&lt;td&gt;Toggle terminal open/close&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+Shift+`
&lt;/td&gt;
&lt;td&gt;Create new terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+PageUp
&lt;/td&gt;
&lt;td&gt;Previous terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+PageDown
&lt;/td&gt;
&lt;td&gt;Next terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+Shift+C
&lt;/td&gt;
&lt;td&gt;Copy selected text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+Shift+V
&lt;/td&gt;
&lt;td&gt;Paste&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+Shift+W
&lt;/td&gt;
&lt;td&gt;Close terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+Shift+Home
&lt;/td&gt;
&lt;td&gt;Clear terminal (or &lt;code&gt;clear&lt;/code&gt; command)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Customizing Your Terminal
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Change Terminal Font Size
&lt;/h3&gt;

&lt;p&gt;In Settings (Ctrl+,), search "terminal font size":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"terminal.integrated.fontSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Change Terminal Font Family
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"terminal.integrated.fontFamily"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cascadia Code"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Popular options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cascadia Code&lt;/strong&gt; (Microsoft's modern monospace font)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fira Code&lt;/strong&gt; (elegant, with ligatures)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JetBrains Mono&lt;/strong&gt; (developer-focused)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consolas&lt;/strong&gt; (Windows built-in, simple)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Change Terminal Appearance
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"terminal.integrated.colorScheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"One Dark Pro"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"terminal.integrated.lineHeight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "bash: command not found"
&lt;/h3&gt;

&lt;p&gt;If bash isn't in your PATH, you need to specify the full path. In VS Code settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"terminal.integrated.defaultProfile.windows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bash"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"terminal.integrated.profiles.windows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Windows&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;System32&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;bash.exe"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or simply use &lt;code&gt;Ubuntu (WSL)&lt;/code&gt; as your default profile instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Terminal Opens in Wrong Directory
&lt;/h3&gt;

&lt;p&gt;By default, the integrated terminal opens in your project root (where you opened the folder). If it opens elsewhere, you can force it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"terminal.integrated.cwd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${workspaceFolder}"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Terminal Text is Too Small or Too Large
&lt;/h3&gt;

&lt;p&gt;Adjust in Settings (Ctrl+,):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"terminal.integrated.fontSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Try sizes between 12-18 depending on your monitor.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sources / additional material:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/docs/editor/integrated-terminal" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/editor/integrated-terminal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/docs/editor/command-line" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/editor/command-line&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/microsoft/vscode/wiki/Terminal-Profiles" rel="noopener noreferrer"&gt;https://github.com/microsoft/vscode/wiki/Terminal-Profiles&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article was generated with AI for the purpose of providing practical information. I have reviewed it and edited it appropriately.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>vscode</category>
      <category>bash</category>
      <category>mentoring</category>
    </item>
    <item>
      <title>Using VS Code with WSL</title>
      <dc:creator>Phillip A. Wessels</dc:creator>
      <pubDate>Tue, 26 May 2026 09:06:33 +0000</pubDate>
      <link>https://forem.com/pawper/using-vs-code-with-wsl-1f7g</link>
      <guid>https://forem.com/pawper/using-vs-code-with-wsl-1f7g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: This guide is for Windows only.&lt;/strong&gt; If you're on macOS, you are already living in Unix in VS Code, so you can skip this tutorial and move on to the next one in the series.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, you're on Windows. You've installed VS Code, WSL and Windows Terminal per the previous entries in the series -- but here's the problem: your editor VS Code is a Windows application. As discussed in the last entry in the series, the world of modern web development assumes a Unix-based environment. You have WSL (Linux) -- so you're close! -- but if you don't configure VS Code properly, you'll be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Editing files in Windows while tools run in Linux (file sync issues)&lt;/li&gt;
&lt;li&gt;Running commands in the wrong environment&lt;/li&gt;
&lt;li&gt;Dealing with path mismatches and permission problems&lt;/li&gt;
&lt;li&gt;Losing the seamless development experience you're after&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The solution is &lt;strong&gt;Remote - WSL&lt;/strong&gt;, an extension that connects VS Code directly to your WSL environment. This tutorial shows you how to set it up.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Remote - WSL?
&lt;/h2&gt;

&lt;p&gt;Remote - WSL is a Microsoft extension that lets VS Code run &lt;strong&gt;inside your WSL environment&lt;/strong&gt; instead of Windows. Here's what that unlocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code connects to WSL and runs there&lt;/li&gt;
&lt;li&gt;You edit files in your Linux home directory (&lt;code&gt;~/projects/...&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;All commands run in the same Linux environment&lt;/li&gt;
&lt;li&gt;Everything is unified and seamless&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's the missing link between your Windows editor and Linux development environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Here's the key insight: you want to &lt;strong&gt;stay on one side of the fence&lt;/strong&gt;. Don't straddle Windows and Linux simultaneously while developing. It's really for the best! And VS Code makes it easy.&lt;/p&gt;

&lt;p&gt;When you configure VS Code to work with WSL, several things happen:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Common Base Experience:&lt;/strong&gt; Your terminal automatically opens bash, not PowerShell. This means instructions in future tutorials work identically whether you're on Windows or macOS. No need for special "Windows version" steps—you're developing in a Unix environment on both platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better Performance:&lt;/strong&gt; Accessing files from your WSL home directory is faster than accessing Windows files through &lt;code&gt;/mnt/c/&lt;/code&gt;. Keeping everything on the Linux side means no cross-filesystem overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Single Source of Truth:&lt;/strong&gt; All your projects live in one place (WSL), one filesystem, one set of permissions. No confusion about whether you edited a file from Windows or WSL, no permission conflicts, no npm package installation weirdness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Foundation for What's Next:&lt;/strong&gt; Later in this series, you'll use Docker to run projects in isolated containers. Docker extends this principle—your code runs in the same type of environment locally as it does in production. WSL is the first step: establishing that your local development happens in a Unix environment, not Windows.&lt;/p&gt;

&lt;p&gt;So -- when you are working on a project, in most cases you'll live on the WSL side of the fence through VS Code. Don't be intimidated. You can do it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Remote - WSL
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Install the Extension
&lt;/h3&gt;

&lt;p&gt;Open VS Code and install &lt;strong&gt;Remote - WSL&lt;/strong&gt; (by Microsoft):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;strong&gt;Ctrl+Shift+X&lt;/strong&gt; to open Extensions&lt;/li&gt;
&lt;li&gt;Search for "Remote - WSL"&lt;/li&gt;
&lt;li&gt;Click the first result (official Microsoft extension)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Install&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. The extension will install in seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Verify Installation
&lt;/h3&gt;

&lt;p&gt;Look at the bottom-left corner of VS Code. You should see a green button or icon indicating the remote connection status. If you see "WSL" or a green icon, the extension is active.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opening a WSL Project Folder
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Method 1: Open Folder from WSL
&lt;/h3&gt;

&lt;p&gt;This is the most reliable way:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Windows Terminal and launch bash (which opens WSL)&lt;/li&gt;
&lt;li&gt;Navigate to your project folder:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or create a new one:&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;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/projects/my-project
   &lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Open VS Code from that directory:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   code &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;VS Code will launch and automatically detect WSL. You'll see "WSL" in the bottom-left corner, confirming you're connected.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 2: Open Folder via VS Code UI
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open VS Code&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;File → Open Folder&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to &lt;code&gt;\\wsl$\Ubuntu\home\your-username\&lt;/code&gt; (your WSL home)&lt;/li&gt;
&lt;li&gt;Select your project folder&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Select Folder&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;VS Code will connect to WSL automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 3: Use the Remote Connection Button
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open VS Code&lt;/li&gt;
&lt;li&gt;Click the green icon or button in the bottom-left corner&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;"Open Folder in WSL"&lt;/strong&gt; or &lt;strong&gt;"Connect to WSL"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select your project folder when prompted&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Working Inside WSL
&lt;/h2&gt;

&lt;p&gt;Once VS Code is connected to WSL, everything works in the Linux environment:&lt;/p&gt;

&lt;h3&gt;
  
  
  File Explorer
&lt;/h3&gt;

&lt;p&gt;Your file explorer shows your WSL filesystem, not Windows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/home/username/&lt;/code&gt; is your home directory&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/home/username/projects/&lt;/code&gt; is where you keep projects&lt;/li&gt;
&lt;li&gt;Paths use &lt;code&gt;/&lt;/code&gt; not &lt;code&gt;\&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Terminal
&lt;/h3&gt;

&lt;p&gt;When you open a terminal in VS Code (Ctrl+`), it opens &lt;strong&gt;bash in WSL&lt;/strong&gt;, not PowerShell in Windows. This is perfect because all your tools (npm, git, node) are already here.&lt;/p&gt;

&lt;h3&gt;
  
  
  File Permissions
&lt;/h3&gt;

&lt;p&gt;Files are created with proper Linux permissions. No more permission issues when switching between editors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying Your Environment
&lt;/h2&gt;

&lt;p&gt;Open the terminal in VS Code (Ctrl+`) and verify you're in WSL:&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;echo&lt;/span&gt; &lt;span class="nv"&gt;$SHELL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Should show &lt;code&gt;/bin/bash&lt;/code&gt; or &lt;code&gt;/bin/zsh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Check your location:&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;pwd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Should show &lt;code&gt;/home/username/...&lt;/code&gt;, not &lt;code&gt;C:\Users\...&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Issues
&lt;/h2&gt;

&lt;h3&gt;
  
  
  VS Code Doesn't Show WSL Option
&lt;/h3&gt;

&lt;p&gt;Make sure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You've installed the &lt;strong&gt;Remote - WSL&lt;/strong&gt; extension&lt;/li&gt;
&lt;li&gt;You have WSL installed (run &lt;code&gt;wsl --version&lt;/code&gt; in Windows Terminal)&lt;/li&gt;
&lt;li&gt;You have a Linux distribution installed (like Ubuntu)&lt;/li&gt;
&lt;li&gt;You've restarted VS Code after installing the extension&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Can't Find Your Project Folder
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;\\wsl$\Ubuntu\&lt;/code&gt; in the File → Open Folder dialog:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;File → Open Folder&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;\\wsl$\Ubuntu\&lt;/code&gt; in the address bar&lt;/li&gt;
&lt;li&gt;Press Enter&lt;/li&gt;
&lt;li&gt;Navigate to &lt;code&gt;/home/your-username/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select your project&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Terminal Shows PowerShell Instead of Bash
&lt;/h3&gt;

&lt;p&gt;Your VS Code terminal might still default to PowerShell. Change it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;strong&gt;Ctrl+,&lt;/strong&gt; to open Settings&lt;/li&gt;
&lt;li&gt;Search "terminal default profile"&lt;/li&gt;
&lt;li&gt;Find &lt;strong&gt;Terminal › Integrated: Default Profile: Windows&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Change to &lt;strong&gt;bash&lt;/strong&gt; or &lt;strong&gt;Ubuntu (WSL)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Files Show as Modified Even Though You Didn't Change Them
&lt;/h3&gt;

&lt;p&gt;This usually happens when you edit files from both Windows and WSL. To avoid it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always edit files &lt;strong&gt;inside VS Code connected to WSL&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Don't edit the same files from Windows and WSL simultaneously&lt;/li&gt;
&lt;li&gt;Use VS Code's WSL connection exclusively for development&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Best Practice: Organize Your Projects in WSL
&lt;/h2&gt;

&lt;p&gt;Create a dedicated projects directory in WSL and keep all your work there. You should do this directly via Bash in the terminal:&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;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/projects/my-project
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-project
code &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then always use &lt;code&gt;code .&lt;/code&gt; from WSL to open projects in VS Code. This ensures VS Code always knows it's in WSL and everything stays in one environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Windows Files?
&lt;/h2&gt;

&lt;p&gt;If you absolutely need to access Windows files (like Downloads), you can. They're mounted at &lt;code&gt;/mnt/c/&lt;/code&gt;:&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;cd&lt;/span&gt; /mnt/c/Users/YourUsername/Downloads
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But for development, keep projects in your WSL home directory. Performance and permissions are better there.&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%2Fy7da7sj4p4cobnb6wctf.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%2Fy7da7sj4p4cobnb6wctf.png" alt="The Shared Filesystem (Generated with Claude Design)" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sources / additional material:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/docs/remote/remote-overview" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/remote/remote-overview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/docs/remote/wsl" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/remote/wsl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.visualstudio.com/docs/remote/wsl-tutorial" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/remote/wsl-tutorial&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article was generated with AI for the purpose of providing practical information. I have reviewed it and edited it appropriately.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>wsl</category>
      <category>mentoring</category>
    </item>
    <item>
      <title>Installing Terminal &amp; WSL (Windows Subsystem for Linux)</title>
      <dc:creator>Phillip A. Wessels</dc:creator>
      <pubDate>Sat, 23 May 2026 19:16:41 +0000</pubDate>
      <link>https://forem.com/pawper/installing-terminal-wsl-windows-subsystem-for-linux-1e0k</link>
      <guid>https://forem.com/pawper/installing-terminal-wsl-windows-subsystem-for-linux-1e0k</guid>
      <description>&lt;p&gt;If you're a web developer on Windows, Windows Subsystem for Linux (WSL) is essential. This tutorial walks you through understanding what WSL is, why you should use it, and how to install and configure it for development.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: This guide is for Windows only.&lt;/strong&gt; If you're on macOS, you already have a Unix-based terminal, so you can skip this tutorial and move on to the next one in the series.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Do I really need WSL?
&lt;/h2&gt;

&lt;p&gt;Short answer: &lt;strong&gt;Yes, if you're doing web development on Windows.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most web development tools, packages, and tutorials assume a Unix-based environment (Linux or macOS). While you &lt;em&gt;can&lt;/em&gt; develop on Windows using PowerShell or cmd.exe, you'll constantly run into compatibility issues with package managers, build tools, and open-source projects that assume a Unix shell. WSL lets you run Linux directly on Windows without the overhead of a virtual machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What exactly is WSL?
&lt;/h2&gt;

&lt;p&gt;Windows Subsystem for Linux (WSL) is a compatibility layer that allows you to run a genuine Linux environment directly on Windows. It runs a real Linux kernel in a lightweight virtual machine while remaining tightly integrated with Windows—you get the speed and compatibility of Linux with the convenience of Windows.&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%2Flxdenm9aptleokxaplot.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%2Flxdenm9aptleokxaplot.png" alt="WSL is a layer between Windows &amp;amp; Linux (Generated with ChatGPT)" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's a Linux distribution (distro)?
&lt;/h2&gt;

&lt;p&gt;A Linux distribution is a packaged version of the Linux kernel bundled with specific tools, package managers, and system utilities. Common distributions include Ubuntu, Debian, Fedora, and Alpine. For development, &lt;strong&gt;Ubuntu&lt;/strong&gt; is the most beginner-friendly and widely supported choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why WSL instead of dual-booting Linux?
&lt;/h2&gt;

&lt;p&gt;Dual-booting lets you choose your OS at startup, but you can't use Windows and Linux simultaneously without rebooting. WSL gives you both environments running at the same time with seamless file access between them. You get the best of both worlds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why WSL instead of a virtual machine (VM)?
&lt;/h2&gt;

&lt;p&gt;VMs use more system resources (CPU, RAM, storage) than WSL. WSL is lightweight, boots faster, and integrates better with Windows. If you're resource-constrained or want a quick development environment, WSL is superior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do I lose anything by using WSL?
&lt;/h2&gt;

&lt;p&gt;WSL gives you a Linux shell and command-line tools, but it doesn't run a full graphical Linux desktop by default. You'll still use Windows for your GUI applications (VS Code, browsers, etc.) and access Linux through the terminal. This is exactly what most developers want.&lt;/p&gt;




&lt;h2&gt;
  
  
  💻 Install Windows Terminal (Recommended)
&lt;/h2&gt;

&lt;p&gt;Windows Terminal is Microsoft's modern terminal application. Instead of using the default Windows PowerShell or cmd.exe, Windows Terminal provides a cleaner, more customizable experience with multiple tabs, themes, and seamless WSL integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's a Terminal?&lt;/strong&gt; As explained in &lt;a href="https://pawper.dev/?v=entry&amp;amp;cat=logs&amp;amp;entry=latest&amp;amp;modal=log&amp;amp;id=intro-to-operating-systems-terminals-shells-faq-4agm" rel="noopener noreferrer"&gt;FAQ: Operating Systems, Terminals &amp;amp; Shells&lt;/a&gt;, a terminal is the application that runs a shell (the command-line interpreter). Windows Terminal is the container app, while Bash/Zsh/PowerShell are the shells inside it. See that FAQ for deeper explanation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install from Microsoft Store:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Microsoft Store (search "Microsoft Store" in the Windows Start menu)&lt;/li&gt;
&lt;li&gt;Search for "Windows Terminal"&lt;/li&gt;
&lt;li&gt;Click "Install"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it! Once installed, Windows Terminal is ready to use. You'll use it to run the WSL installation command in the next section. After WSL is installed, Windows Terminal will automatically recognize Ubuntu as an available shell profile.&lt;/p&gt;




&lt;h2&gt;
  
  
  💻 Install WSL
&lt;/h2&gt;

&lt;p&gt;These instructions are for &lt;strong&gt;Windows 10 (Build 19041+) or Windows 11&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Check Your Windows Version
&lt;/h3&gt;

&lt;p&gt;Press &lt;code&gt;Win + R&lt;/code&gt;, type &lt;code&gt;winver&lt;/code&gt;, and press Enter. You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows 10&lt;/strong&gt;: Version 21H2 or later (Build 19041 or higher)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows 11&lt;/strong&gt;: Any version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need to update, go to Settings → System → About → Windows Update.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Enable WSL
&lt;/h3&gt;

&lt;p&gt;Open &lt;strong&gt;Windows Terminal as Administrator&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Right-click the Windows Terminal icon (in Start menu or taskbar)&lt;/li&gt;
&lt;li&gt;Select "Run as Administrator"&lt;/li&gt;
&lt;li&gt;You may see a prompt asking "Do you want to allow this app to make changes?" — click "Yes"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once Windows Terminal opens with admin privileges, you'll see a command prompt. Regardless of which shell it displays (PowerShell, cmd.exe, or another), the &lt;code&gt;wsl --install&lt;/code&gt; command works in any of them. Simply paste or type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wsl &lt;span class="nt"&gt;--install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single command will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enable WSL and the Virtual Machine Platform feature&lt;/li&gt;
&lt;li&gt;Download and install Ubuntu (the default distro)&lt;/li&gt;
&lt;li&gt;Automatically configure the latest version for you&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: If you see an error about virtualization, you may need to enable it in your BIOS. Restart your computer, enter BIOS (usually by pressing F2, F10, DEL, or ESC during startup — varies by manufacturer), and look for "Virtualization" or "Intel VT-x" / "AMD-V" and enable it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 3: Restart Your Computer
&lt;/h3&gt;

&lt;p&gt;WSL requires a system restart. Do this now.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Complete Ubuntu Setup
&lt;/h3&gt;

&lt;p&gt;After restarting, Ubuntu may launch automatically, or you may need to launch it manually:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If Ubuntu launches automatically:&lt;/strong&gt; You'll see a terminal window prompt you to create a username and password. Skip to the next section.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If Ubuntu doesn't launch automatically:&lt;/strong&gt; Open Windows Terminal, click the dropdown arrow in the toolbar, and select "Ubuntu" to launch the setup.&lt;/p&gt;

&lt;p&gt;Either way, you'll see a setup prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows user name.
For more information visit: https://aka.ms/wsluserstore
Enter new UNIX username: [type your username]
New password: [type a password]
Retype new password: [confirm password]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choose a simple username (e.g., &lt;code&gt;dev&lt;/code&gt; or your first name). &lt;strong&gt;Remember this password&lt;/strong&gt; — you'll need it for administrative tasks in WSL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pawper.dev/?v=entry&amp;amp;cat=logs&amp;amp;entry=latest&amp;amp;modal=log&amp;amp;id=guide-password-management-cybersecurity-beginners" rel="noopener noreferrer"&gt;https://pawper.dev/?v=entry&amp;amp;cat=logs&amp;amp;entry=latest&amp;amp;modal=log&amp;amp;id=guide-password-management-cybersecurity-beginners&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Verify Installation
&lt;/h3&gt;

&lt;p&gt;In the Ubuntu terminal that's now open, verify everything works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wsl &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see output showing WSL version 2.x.&lt;/p&gt;

&lt;p&gt;Also verify your Linux distribution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsb_release &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see Ubuntu information.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sources / additional material:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/install" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/windows/wsl/install&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/about" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/windows/wsl/about&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/setup/environment" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/windows/wsl/setup/environment&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Step 6: Configure Windows Terminal for Ubuntu
&lt;/h3&gt;

&lt;p&gt;Now that WSL and Ubuntu are installed, you can use Windows Terminal to access your Linux environment. Open Windows Terminal and you'll see a dropdown arrow in the top toolbar — click it and select "Ubuntu" to launch your WSL bash shell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set Ubuntu as Default (Optional):&lt;/strong&gt; If you want Ubuntu to open automatically when you launch Windows Terminal, go to Settings (Ctrl+,), find "Startup" in the left sidebar, and set "Default profile" to "Ubuntu".&lt;/p&gt;




&lt;h2&gt;
  
  
  Configure WSL for Development
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Update Your Linux Packages
&lt;/h3&gt;

&lt;p&gt;WSL comes with Ubuntu, but the package lists may be outdated. Run:&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 upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;sudo&lt;/code&gt; command runs commands with administrator privileges. You'll be prompted for your password (the one you created in Step 4).&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Essential Build Tools
&lt;/h3&gt;

&lt;p&gt;Most web development depends on a C/C++ compiler. Install it:&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 &lt;span class="nb"&gt;install &lt;/span&gt;build-essential &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This installs &lt;code&gt;gcc&lt;/code&gt;, &lt;code&gt;g++&lt;/code&gt;, &lt;code&gt;make&lt;/code&gt;, and other tools needed to compile native packages.&lt;/p&gt;

&lt;h3&gt;
  
  
  (Optional) Install Git
&lt;/h3&gt;

&lt;p&gt;If you don't have Git installed on your Windows machine, install it in WSL:&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 &lt;span class="nb"&gt;install &lt;/span&gt;git &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: You can use either the Windows version or WSL version of Git. I recommend installing it in both places so you have flexibility.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  (Optional) Install Node.js (via nvm)
&lt;/h3&gt;

&lt;p&gt;Many web tutorials use Node.js. The easiest way to manage Node versions is with nvm (Node Version Manager):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then reload your shell:&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;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Node.js:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;--version&lt;/span&gt;
npm &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Access Your Files
&lt;/h2&gt;

&lt;p&gt;WSL and Windows share a file system, but you need to know the paths:&lt;/p&gt;

&lt;h3&gt;
  
  
  From WSL, Access Windows Files
&lt;/h3&gt;

&lt;p&gt;Your Windows &lt;code&gt;C:&lt;/code&gt; drive is mounted at &lt;code&gt;/mnt/c/&lt;/code&gt; in WSL:&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;cd&lt;/span&gt; /mnt/c/Users/YourUsername/Documents
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  From Windows, Access WSL Files
&lt;/h3&gt;

&lt;p&gt;Your WSL home directory is located at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\\wsl$\Ubuntu\home\username&amp;lt;br&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open File Explorer and type this path in the address bar. You can also open it with &lt;code&gt;explorer.exe ~&lt;/code&gt; from the WSL terminal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practice
&lt;/h3&gt;

&lt;p&gt;Keep your development projects in &lt;strong&gt;WSL's home directory&lt;/strong&gt; (&lt;code&gt;~/projects/&lt;/code&gt; or similar), not in Windows. This avoids file permission issues and improves performance.&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%2Fzdwz15e4sctgr3v9uq6z.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%2Fzdwz15e4sctgr3v9uq6z.png" alt="Shared file system (Generated with ChatGPT)" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  WSL Doesn't Start / "Command Not Found"
&lt;/h3&gt;

&lt;p&gt;Make sure you ran &lt;code&gt;wsl --install&lt;/code&gt; in &lt;strong&gt;PowerShell as Administrator&lt;/strong&gt;, not cmd.exe or a regular PowerShell window.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Virtualization is not enabled"
&lt;/h3&gt;

&lt;p&gt;You need to enable virtualization in your BIOS. Restart your computer, enter BIOS (varies by manufacturer), and look for "Virtualization" or "VT-x" / "AMD-V".&lt;/p&gt;

&lt;h3&gt;
  
  
  WSL Is Slow
&lt;/h3&gt;

&lt;p&gt;This might mean you're accessing files across the Windows/WSL boundary. Keep your projects in WSL's home directory, not &lt;code&gt;/mnt/c/&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Forgot Your WSL Password
&lt;/h3&gt;

&lt;p&gt;In PowerShell, reset it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then exit and log back in as your regular user.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sources / additional material:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/install" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/windows/wsl/install&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/about" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/windows/wsl/about&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/setup/environment" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/windows/wsl/setup/environment&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/troubleshoot/common-issues" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/windows/wsl/troubleshoot/common-issues&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/setup/windows-terminal" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/windows/wsl/setup/windows-terminal&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article was generated with AI for the purpose of providing practical information. I have reviewed it for accuracy and edited it appropriately.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wsl</category>
      <category>bash</category>
    </item>
    <item>
      <title>Password Management &amp; Cybersecurity for Beginners</title>
      <dc:creator>Phillip A. Wessels</dc:creator>
      <pubDate>Sat, 23 May 2026 09:30:03 +0000</pubDate>
      <link>https://forem.com/pawper/password-management-cybersecurity-for-beginners-1mai</link>
      <guid>https://forem.com/pawper/password-management-cybersecurity-for-beginners-1mai</guid>
      <description>&lt;p&gt;You don't need to be a security expert to protect yourself online. This guide covers the essential practices that will keep your accounts, code, and data safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reality of Online Security
&lt;/h2&gt;

&lt;p&gt;Every day, millions of passwords are stolen, accounts are hacked, and sensitive data is exposed. The good news: most attacks aren't sophisticated. They succeed because people use weak passwords, reuse passwords across sites, or fall for social engineering. You can protect yourself with simple, consistent habits.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's a Strong Password?
&lt;/h2&gt;

&lt;p&gt;A strong password is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Long&lt;/strong&gt; (16+ characters is ideal, minimum 12)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unique&lt;/strong&gt; (never reuse the same password across sites)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex&lt;/strong&gt; (mix of uppercase, lowercase, numbers, symbols: &lt;code&gt;P@ssw0rd!Secure2024&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unpredictable&lt;/strong&gt; (not based on personal info like birthdays or pet names)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A weak password is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Short (&lt;code&gt;password&lt;/code&gt;, &lt;code&gt;123456&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Dictionary words (&lt;code&gt;dragon&lt;/code&gt;, &lt;code&gt;football&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Personal information (&lt;code&gt;birthdate&lt;/code&gt;, &lt;code&gt;spouse's name&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Patterns (&lt;code&gt;qwerty&lt;/code&gt;, &lt;code&gt;aaa111&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: Remembering 50+ unique, complex passwords is impossible. This is where password managers come in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's a Password Manager?
&lt;/h2&gt;

&lt;p&gt;A password manager is an application that securely stores all your passwords in an encrypted vault. You remember &lt;em&gt;one&lt;/em&gt; master password, and the manager remembers the rest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You create one strong master password&lt;/li&gt;
&lt;li&gt;The manager generates unique, complex passwords for each account&lt;/li&gt;
&lt;li&gt;You log into the manager with your master password&lt;/li&gt;
&lt;li&gt;The manager auto-fills passwords when you visit websites&lt;/li&gt;
&lt;li&gt;Everything is encrypted — even the password manager company can't see your passwords&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Popular options:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bitwarden&lt;/strong&gt; (open-source, free tier available, excellent for beginners)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1Password&lt;/strong&gt; (premium, very user-friendly)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LastPass&lt;/strong&gt; (free tier, widely used)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KeePass&lt;/strong&gt; (free, offline, more technical)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I recommend &lt;strong&gt;Bitwarden&lt;/strong&gt; for most people: it's free, open-source, and works across all devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two-Factor Authentication (2FA)
&lt;/h2&gt;

&lt;p&gt;Two-factor authentication means you need two things to log in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Something you &lt;strong&gt;know&lt;/strong&gt; (password)&lt;/li&gt;
&lt;li&gt;Something you &lt;strong&gt;have&lt;/strong&gt; (phone, security key, or authenticator app)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Even if someone steals your password, they can't access your account without the second factor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Types of 2FA:&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SMS / Text Message
&lt;/h3&gt;

&lt;p&gt;A code is texted to your phone. Simple, but vulnerable to SIM swapping (hackers convince your phone company to transfer your number to their phone).&lt;/p&gt;

&lt;h3&gt;
  
  
  Authenticator Apps
&lt;/h3&gt;

&lt;p&gt;Apps like Google Authenticator, Microsoft Authenticator, or Authy generate time-based codes on your phone. More secure than SMS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Example code from authenticator: 482953 (changes every 30 seconds)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Security Keys
&lt;/h3&gt;

&lt;p&gt;Physical devices (USB or wireless) that confirm login attempts. The most secure option.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommendation&lt;/strong&gt;: Use authenticator apps for important accounts (email, GitHub, Stripe, AWS). Use SMS as a backup if authenticator isn't available.&lt;/p&gt;




&lt;h2&gt;
  
  
  Social Engineering Attacks
&lt;/h2&gt;

&lt;p&gt;Social engineering is tricking people into revealing secrets or bypassing security. It's often easier than hacking.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phishing
&lt;/h3&gt;

&lt;p&gt;Attackers send emails that appear to be from trusted companies (your bank, GitHub, PayPal) asking you to "verify your account" or "confirm your identity."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example phishing email:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight email"&gt;&lt;code&gt;&lt;span class="nt"&gt;From&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; security@paypal.com&lt;/span&gt;
&lt;span class="nt"&gt;Subject&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="na"&gt; Urgent: Confirm Your Identity&lt;/span&gt;

Your account has suspicious activity. Click here to verify:
paypal-security-verify.com/login

[FAKE LINK]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to spot phishing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check the sender's email address carefully (paypal.com is real; paypal.security.com is fake)&lt;/li&gt;
&lt;li&gt;Hover over links before clicking — see the actual URL&lt;/li&gt;
&lt;li&gt;Legitimate companies never ask you to verify passwords via email&lt;/li&gt;
&lt;li&gt;Look for poor grammar or urgent language ("Act now!" "Verify immediately!")&lt;/li&gt;
&lt;li&gt;If in doubt, close the email and visit the company's website directly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Spoofs
&lt;/h3&gt;

&lt;p&gt;A spoof is when someone pretends to be someone else (via email, phone, text). They might:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send an email that appears to be from your boss asking to wire money&lt;/li&gt;
&lt;li&gt;Call pretending to be from IT support asking for your password&lt;/li&gt;
&lt;li&gt;Text as your bank asking you to confirm your account number&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Golden rule: Never trust communication you didn't initiate.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If someone claims to be from your bank, GitHub, or any company:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Don't click links or call numbers in the message&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go to the official website directly&lt;/strong&gt; (type the URL yourself or use a bookmark)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log in and check for alerts&lt;/strong&gt; in your account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call the official phone number&lt;/strong&gt; from the company's website (not from the email/text)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❌ You receive: Email from "GitHub" with link asking to verify your account
✅ What to do: Go to github.com directly, log in, check your security settings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Malware
&lt;/h3&gt;

&lt;p&gt;Malware is malicious software that infects your computer. It can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Steal passwords (keyloggers record everything you type)&lt;/li&gt;
&lt;li&gt;Steal files and data&lt;/li&gt;
&lt;li&gt;Hijack your browser&lt;/li&gt;
&lt;li&gt;Lock your files for ransom (ransomware)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to avoid malware:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download software only from official sources (GitHub, npm, official websites)&lt;/li&gt;
&lt;li&gt;Be cautious of email attachments (especially .exe, .zip, .bat files)&lt;/li&gt;
&lt;li&gt;Keep your operating system and software updated&lt;/li&gt;
&lt;li&gt;Use antivirus software (Windows Defender is built into Windows)&lt;/li&gt;
&lt;li&gt;Don't run scripts or commands from untrusted sources&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Developer-Specific Security
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem: Secrets in Code
&lt;/h3&gt;

&lt;p&gt;Developers often need to store secrets like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database passwords&lt;/li&gt;
&lt;li&gt;API keys (Stripe, OpenAI, AWS)&lt;/li&gt;
&lt;li&gt;OAuth tokens&lt;/li&gt;
&lt;li&gt;Authentication credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Never commit secrets to version control.&lt;/strong&gt; If you push secrets to GitHub, they're exposed to the world — and attackers scan GitHub for exposed keys.&lt;/p&gt;

&lt;p&gt;Example of what NOT to do:&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="c1"&gt;// ❌ NEVER DO THIS&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sk-1234567890abcdefgh&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;myPassword123&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;h3&gt;
  
  
  The Solution: Environment Variables &amp;amp; .env Files
&lt;/h3&gt;

&lt;p&gt;Store secrets in a &lt;code&gt;.env&lt;/code&gt; file (local only, never committed):&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your &lt;code&gt;.env&lt;/code&gt; file (local, never uploaded):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;sk-1234567890abcdefgh&lt;/span&gt;
&lt;span class="py"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;mySecurePassword123&lt;/span&gt;
&lt;span class="py"&gt;STRIPE_SECRET_KEY&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;sk_live_...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Your &lt;code&gt;.gitignore&lt;/code&gt; file (tells Git to ignore the .env file):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.env
.env.local
.env.*.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Your code (reads from environment variables):&lt;/strong&gt;&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How to Use .env Files
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a &lt;code&gt;.env&lt;/code&gt; file in your project root&lt;/li&gt;
&lt;li&gt;Add your secrets: &lt;code&gt;KEY=value&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;.env&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In your code, read from &lt;code&gt;process.env.KEY&lt;/code&gt; (Node.js) or &lt;code&gt;process.env&lt;/code&gt; (most languages)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never commit &lt;code&gt;.env&lt;/code&gt;&lt;/strong&gt; — only commit &lt;code&gt;.env.example&lt;/code&gt; with placeholder values&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example &lt;code&gt;.env.example&lt;/code&gt; (for documentation):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your-api-key-here&lt;/span&gt;
&lt;span class="py"&gt;DATABASE_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your-password-here&lt;/span&gt;
&lt;span class="py"&gt;STRIPE_SECRET_KEY&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;your-stripe-key-here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tools for Managing Secrets
&lt;/h3&gt;

&lt;p&gt;For production environments, use dedicated secret management tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS Secrets Manager&lt;/strong&gt; — cloud-hosted secret storage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HashiCorp Vault&lt;/strong&gt; — open-source secret management&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Secrets&lt;/strong&gt; — for CI/CD pipelines (Actions, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel/Netlify Environment Variables&lt;/strong&gt; — for serverless deployments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are more secure than .env files for production.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Security Checklist
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Your Personal Accounts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use a password manager (Bitwarden, 1Password, or LastPass)&lt;/li&gt;
&lt;li&gt;Create one strong master password and memorize it&lt;/li&gt;
&lt;li&gt;Enable 2FA on critical accounts (email, GitHub, banking, social media)&lt;/li&gt;
&lt;li&gt;Use authenticator apps instead of SMS when possible&lt;/li&gt;
&lt;li&gt;Never click links in suspicious emails — visit websites directly&lt;/li&gt;
&lt;li&gt;Never give passwords or 2FA codes to anyone, even "IT support"&lt;/li&gt;
&lt;li&gt;Keep your OS and software updated&lt;/li&gt;
&lt;li&gt;Use a VPN on public WiFi if handling sensitive work&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Your Development Projects
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;code&gt;.env&lt;/code&gt; file for local secrets&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;.env&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt; before your first commit&lt;/li&gt;
&lt;li&gt;Create a &lt;code&gt;.env.example&lt;/code&gt; with placeholder values&lt;/li&gt;
&lt;li&gt;Never commit real API keys, passwords, or tokens&lt;/li&gt;
&lt;li&gt;Review your &lt;code&gt;.git&lt;/code&gt; history — if you accidentally committed secrets, revoke them immediately&lt;/li&gt;
&lt;li&gt;Use environment variables in production (deployment platforms handle this)&lt;/li&gt;
&lt;li&gt;Keep dependencies updated (&lt;code&gt;npm update&lt;/code&gt;, &lt;code&gt;pip install --upgrade&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Be cautious installing packages from npm, pip, etc. — check the source and download counts&lt;/li&gt;
&lt;li&gt;Ask friends and trusted sources for recommendations before risking stranger danger.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  If You've Been Hacked
&lt;/h2&gt;

&lt;p&gt;If you think your password has been compromised:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Immediately change your password&lt;/strong&gt; at that site&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check if your email was in a breach&lt;/strong&gt; at &lt;a href="https://haveibeenpwned.com" rel="noopener noreferrer"&gt;https://haveibeenpwned.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change your email password&lt;/strong&gt; (your email is the key to all other accounts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable 2FA&lt;/strong&gt; on that account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review account activity&lt;/strong&gt; for unauthorized actions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor your credit&lt;/strong&gt; (if financial info was exposed)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If your code repository was compromised:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Revoke immediately&lt;/strong&gt; any exposed API keys, tokens, or credentials&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search your git history&lt;/strong&gt; for secrets: &lt;code&gt;git log -p | grep -i "password\|secret\|key"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider re-pushing&lt;/strong&gt; a clean history (or just moving forward)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotate all credentials&lt;/strong&gt; that were exposed&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Remember: Security is Habit
&lt;/h2&gt;

&lt;p&gt;You don't need to be paranoid, just consistent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a password manager (one action, lifelong benefit)&lt;/li&gt;
&lt;li&gt;Enable 2FA on important accounts (one-time setup)&lt;/li&gt;
&lt;li&gt;Verify the source before clicking (takes 5 seconds)&lt;/li&gt;
&lt;li&gt;Don't reuse passwords (password manager handles this)&lt;/li&gt;
&lt;li&gt;Never put secrets in code (use .env)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These habits will protect you from 99% of common attacks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sources / additional material:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check if your email was in a data breach: &lt;br&gt;
&lt;a href="https://haveibeenpwned.com" rel="noopener noreferrer"&gt;https://haveibeenpwned.com&lt;/a&gt;&lt;br&gt;
Open-source password manager: &lt;br&gt;
&lt;a href="https://bitwarden.com" rel="noopener noreferrer"&gt;https://bitwarden.com&lt;/a&gt;&lt;br&gt;
OWASP cheat sheets on security topics (open the menu in the top left): &lt;br&gt;
&lt;a href="https://cheatsheetseries.owasp.org/" rel="noopener noreferrer"&gt;https://cheatsheetseries.owasp.org/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article was generated with AI for the purpose of providing practical information. I have reviewed it for accuracy and edited it appropriately.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
    </item>
    <item>
      <title>Editors, IDEs &amp; Installing VS Code</title>
      <dc:creator>Phillip A. Wessels</dc:creator>
      <pubDate>Fri, 04 Feb 2022 04:39:25 +0000</pubDate>
      <link>https://forem.com/pawper/faq-editors-ides-vs-code-3fp0</link>
      <guid>https://forem.com/pawper/faq-editors-ides-vs-code-3fp0</guid>
      <description>&lt;p&gt;Everything you need to know to get started with VS Code: useful context to the world's most popular code editor, a simple install guide, and some useful keyboard shortcuts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's a code editor?
&lt;/h2&gt;

&lt;p&gt;At its most basic level, a code editor could be a text editor such as Notepad. While it is possible to use such an application, there are dedicated applications for writing code with features such as syntax highlighting. Visual Studio Code (VS Code) is one of them, but you may also encounter others such as Notepad++, Sublime, and Zed. Many editors are extensible.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's an Integrated Development Environment (IDE)?
&lt;/h2&gt;

&lt;p&gt;An IDE is an application that comes with a comprehensive set of features for software development, including a code editor. Standalone editors are distinct from full IDEs, but the distinction is blurred once an editor is sufficiently extended.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's the difference between Visual Studio Code and Visual Studio IDE?
&lt;/h2&gt;

&lt;p&gt;Visual Studio Code is a code editor for a quick code-build-debug cycle with debugging, task running, and version control. Visual Studio IDE is for more complex workflows. While VS Code is free, Visual Studio IDE is premium software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use VS Code?
&lt;/h2&gt;

&lt;p&gt;VS Code is the most popular editor and has many features, including syntax highlighting, IntelliSense code completion, snippets, an integrated terminal, git support out of the box, and the ability to install extensions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sources / additional material:&lt;br&gt;
The official VS Code documentation: &lt;br&gt;
&lt;a href="https://code.visualstudio.com/docs" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs&lt;/a&gt; &lt;br&gt;
&lt;a href="https://code.visualstudio.com/docs/editor/whyvscode" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/editor/whyvscode&lt;/a&gt;&lt;br&gt;
&lt;a href="https://code.visualstudio.com/docs/getstarted/userinterface" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/getstarted/userinterface&lt;/a&gt; &lt;br&gt;
&lt;a href="https://code.visualstudio.com/docs/editor/codebasics" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/editor/codebasics&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💻 Set Up VS Code
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download the Visual Studio Code installer. &lt;a href="https://code.visualstudio.com/download" rel="noopener noreferrer"&gt;https://code.visualstudio.com/download&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;The Insiders edition is a nightly build with the latest features, but it is not a stable release and you may encounter issues. That said, you can have both versions installed. &lt;a href="https://code.visualstudio.com/insiders/" rel="noopener noreferrer"&gt;https://code.visualstudio.com/insiders/&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Once it is downloaded, run the installer. This will only take a minute.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Sources / additional material:&lt;br&gt;
&lt;a href="https://code.visualstudio.com/docs/setup/setup-overview" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/setup/setup-overview&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Extensions
&lt;/h2&gt;

&lt;p&gt;Extensions are key to the VS Code developer experience. You absolutely should explore extensions; often times you will do so to find the best &amp;amp; laziest way to do things. Extensions help make development more accessible. We'll be installing some extensions in this series.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sources / additional material:&lt;br&gt;
&lt;a href="https://code.visualstudio.com/docs/editor/extension-marketplace" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/editor/extension-marketplace&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Settings
&lt;/h2&gt;

&lt;p&gt;VS Code's settings are stored in &lt;code&gt;settings.json&lt;/code&gt;. You can access this by opening the command palette and entering "Preferences: Open Settings (JSON)". &lt;code&gt;.json&lt;/code&gt; files are in JSON - JavaScript Object Notation. This means settings have to be entered in a specific way.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The entire settings object is in a single pair of curly brackets (&lt;code&gt;{}&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Keys - the names of different settings - need to be in quotation marks. E.g., &lt;code&gt;"editor.tabSize"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Values can be strings (in quotation marks), numbers (without quotation marks), boolean (&lt;code&gt;true&lt;/code&gt;/&lt;code&gt;false&lt;/code&gt;), arrays (comma-separated elements in square brackets &lt;code&gt;[]&lt;/code&gt;), or objects (comma-separated key: value pairs in curly brackets &lt;code&gt;{}&lt;/code&gt;). It's out of our scope here to cover data types, but you can be mindful of the indicated syntax.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here are some settings that I recommend:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set the default tab size to 2 spaces. I find that a minimal tab size makes it easier to share blocks of code.&lt;/li&gt;
&lt;li&gt;Set the word wrap as on by default. I don't like scrolling left &amp;amp; right to read a long line of code.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.tabSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.wordWrap"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"on"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can create settings specific to a certain project as well. Just create a &lt;code&gt;.vscode&lt;/code&gt; directory at the top level, and inside it create a &lt;code&gt;settings.json&lt;/code&gt; file. Any specific settings here will override those settings within VS Code's main settings.json.&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%2Fhk7wmzwaxktzvmzbg79v.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%2Fhk7wmzwaxktzvmzbg79v.png" alt="JavaScript React Language Mode" width="715" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you can see that since this is a React project, I am setting all JavaScript files (&lt;code&gt;.js&lt;/code&gt;) to be associated with the JavaScript React language mode (&lt;code&gt;"javascriptreact"&lt;/code&gt;). The icons update as well to the React icon.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sources / additional material:&lt;br&gt;
&lt;a href="https://code.visualstudio.com/docs/configure/settings" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/configure/settings&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📜Key Bindings: VS Code
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+Shift+P
&lt;/td&gt;
&lt;td&gt;Show Command Palette&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+P
&lt;/td&gt;
&lt;td&gt;Quick Open, Go to File&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+Shift+X
&lt;/td&gt;
&lt;td&gt;Open Extensions panel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+`
&lt;/td&gt;
&lt;td&gt;Show Integrated Terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Alt+Click
&lt;/td&gt;
&lt;td&gt;Insert additional cursors&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  📜Key Bindings: Navigating &amp;amp; Selecting Text
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+→
&lt;/td&gt;
&lt;td&gt;Move the cursor one word to the right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+←
&lt;/td&gt;
&lt;td&gt;Move the cursor one word to the left&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Shift+→
&lt;/td&gt;
&lt;td&gt;Select text to the right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Shift+←
&lt;/td&gt;
&lt;td&gt;Select text to the left&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+Shift+→
&lt;/td&gt;
&lt;td&gt;Select the word to the right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+Shift+←
&lt;/td&gt;
&lt;td&gt;Select the word to the left&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Shift+Home
&lt;/td&gt;
&lt;td&gt;Select to the beginning of the current line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Shift+End
&lt;/td&gt;
&lt;td&gt;Select to the end of the current line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+Shift+Home
&lt;/td&gt;
&lt;td&gt;Select to the beginning of the document&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+Shift+End
&lt;/td&gt;
&lt;td&gt;Select to the end of the document&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Ctrl+A
&lt;/td&gt;
&lt;td&gt;Select all document content&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Sources / additional material:&lt;br&gt;
&lt;a href="https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf" rel="noopener noreferrer"&gt;https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf&lt;/a&gt;&lt;br&gt;
&lt;a href="https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf" rel="noopener noreferrer"&gt;https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf&lt;/a&gt;&lt;br&gt;
&lt;a href="https://code.visualstudio.com/docs/configure/keybindings" rel="noopener noreferrer"&gt;https://code.visualstudio.com/docs/configure/keybindings&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>vscode</category>
      <category>mentoring</category>
    </item>
    <item>
      <title>Operating Systems, Terminals &amp; Shells</title>
      <dc:creator>Phillip A. Wessels</dc:creator>
      <pubDate>Wed, 02 Feb 2022 02:02:36 +0000</pubDate>
      <link>https://forem.com/pawper/intro-to-operating-systems-terminals-shells-faq-4agm</link>
      <guid>https://forem.com/pawper/intro-to-operating-systems-terminals-shells-faq-4agm</guid>
      <description>&lt;p&gt;Welcome to &lt;strong&gt;Foundations of Digital Agency&lt;/strong&gt;—a series built for anyone who wants to seize the tools and technology reshaping opportunity. You don't need permission. You don't need a computer science degree. You just need a cogntivie foundation and some scaffolding assembled from simple ideas. Once you have that sense of structure in mind, you can frame technology within it, move through it and build on top of it. Sound complicated? Language is magic. Once you start reading and applying it, the pieces -- mental models -- fall into place.&lt;/p&gt;

&lt;p&gt;This tutorial starts that process. You'll learn why operating systems matter, what terminals and shells are, and why a Windows developer and a Mac developer can follow the same instructions without confusion. These concepts aren't optional—they're the vocabulary you need to navigate, troubleshoot, and build confidently.&lt;/p&gt;

&lt;p&gt;So, get excited: this knowledge removes barriers. Once you understand these fundamentals, everything that comes next makes sense. You're not intimidated by strange commands or mysterious jargon. You recognize the patterns. You truly own the technology. That's agency.&lt;/p&gt;

&lt;p&gt;Let's get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is UNIX?
&lt;/h2&gt;

&lt;p&gt;UNIX is the ancestor of many modern operating systems (OSs), like macOS and Linux. In 1969 at Bell Laboraties, Ken Thompson starting developing UNIX OS in PDP-7 computer assembly language. Dennis Ritchie joined Thompson and invented the C programming language. Then they rewrote UNIX in C, allowing different computers to run the code. UNIX also included user management and hierarchical file systems. Bell Labs released the first version of UNIX, Version 6 (V6), in 1976. Its design philosophy emphasizes small modular programs that can be used in combination for complex tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write programs that do one thing and do it well.&lt;/li&gt;
&lt;li&gt;Write programs to work together.&lt;/li&gt;
&lt;li&gt;Write programs to handle text streams, because that is a universal interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Linux?
&lt;/h2&gt;

&lt;p&gt;The open-source GNU/Linux (commonly referred to as Linux) is the most famous Unix-like operating system (OS). Released in 1993, it spawned from the Free Software movement of the 1980s. Richard Stallman started the GNU Project of free software which needed a kernel. Fortunately, Linus Torvalds released the Linux kernel in 1991, which the GNU Project was able to combine with for a full OS that was released in 1993. Countless distributions have derived from GNU/Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why aren't all Unix-like operating systems called UNIX? Why do macOS and Linux use the same commands?
&lt;/h2&gt;

&lt;p&gt;The UNIX brand is trademarked and "True UNIX" operating systems like macOS paid to be certified by The Open Group. While not officially UNIX, Unix-like OSs like Linux do fully or mostly meet the UNIX specification but are not certified; therefore, they do not use the UNIX name. The command line works the same, whether True UNIX or Unix-like. While not officially licensed, Unix-like OSs like Linux are designed to meet the UNIX specification.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the history of the modern Windows OS?
&lt;/h2&gt;

&lt;p&gt;Windows NT, upon which the modern Windows and Xbox OSs derive from, started in 1977 with Digital Equipment's release of VMS 1.0 (one year after the release of the first version of UNIX). Many of the developers left Digital in 1988 to join Microsoft, which released Windows NT 3.1 in 1993 (the same year as the release of GNU/Linux).&lt;/p&gt;

&lt;h2&gt;
  
  
  How do Windows and UNIX-based OSs differ?
&lt;/h2&gt;

&lt;p&gt;Both Windows NT and UNIX have roots in the mid-1970s and both were influenced by many identical theoretical OS concepts and principles. However, Windows and UNIX-based systems have different kernels engaging the hardware with different software built on top of those kernels, all based on different specifications. The software differs in many ways.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Windows Subsystem for Linux (WSL)?
&lt;/h2&gt;

&lt;p&gt;Windows Subsystem for Linux lets developers run a GNU/Linux environment—including most command-line tools, utilities, and applications—directly on Windows, unmodified, without the overhead of a traditional virtual machine or dualboot setup. WSL 2 introduced an entirely new architecture that benefits from running a real Linux kernel. It runs in a lightweight virtual machine environment through a subset of Microsoft's Hyper-V features.&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%2Frxir7xpvrei0ajgoaske.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%2Frxir7xpvrei0ajgoaske.png" alt="OS Lineage (Generated with Claude Design)" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  On Windows, why not use a virtual machine (VM) for Linux?
&lt;/h2&gt;

&lt;p&gt;You can, but WSL requires fewer resources (CPU, memory, and storage) than a full VM. You can't easily work between the VM and Windows software.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a terminal?
&lt;/h2&gt;

&lt;p&gt;A terminal is a program that runs a shell. There are many terminal applications, one being the Windows Terminal, another the integrated terminal in VS Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a shell?
&lt;/h2&gt;

&lt;p&gt;A shell is an interpreter for command line language. Common shells include Bash and Zsh for UNIX-based operating systems, and PowerShell for Windows. Note: You cannot run UNIX-based commands through PowerShell, but there are many aliases matching UNIX-based commands which map to PowerShell cmdlets (that just means you kind of can... kind of).&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a CLI?
&lt;/h2&gt;

&lt;p&gt;A CLI is a &lt;strong&gt;Command Line Interface&lt;/strong&gt;—any interface where you interact with a computer using text commands instead of clicking buttons. The terminal is the application; the shell is the interpreter; but CLI is the broader concept: communicating with software by typing commands. When you use Bash, PowerShell, or Zsh, you're using a CLI. When you run &lt;code&gt;npm install&lt;/code&gt; or &lt;code&gt;git commit&lt;/code&gt;, you're using a CLI. CLIs are powerful because they let you express complex instructions precisely and automate tasks through scripts. Many development tools—especially agentic AI tools like Claude Code—live entirely in the CLI.&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%2F6ddw81lkf1z67ysx8cyl.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%2F6ddw81lkf1z67ysx8cyl.png" alt="Anatomy of the Command Line (Generated with Claude Design)" width="799" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Are Bash and PowerShell just shells?
&lt;/h2&gt;

&lt;p&gt;The same names are used to refer to the shells' scripting languages as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why are Bash and PowerShell both useful?
&lt;/h2&gt;

&lt;p&gt;Bash is the scripting language of the Bash shell and its various packages, while PowerShell adds advanced efficiency as an object-oriented scripting language.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Zsh?
&lt;/h2&gt;

&lt;p&gt;Zsh (Z shell) is a Unix shell that is largely compatible with Bash but adds many improvements such as better tab completion, spelling correction, and a richer plugin ecosystem. Since macOS Catalina (2019), Zsh has been the default shell on macOS, replacing Bash. On macOS you may see the prompt message "The default interactive shell is now zsh" — this is expected. Most Bash scripts and commands work in Zsh without modification.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is PowerShell 7?
&lt;/h2&gt;

&lt;p&gt;PowerShell 7 is the current cross-platform (Windows, Linux, and macOS), open-source version of PowerShell. It is the successor to both Windows PowerShell (which remains at version 5.1 and is built into Windows) and PowerShell Core (versions 6.x, a transitional release). PowerShell 7 is what you should install if you want to use PowerShell on macOS or Linux, or want the latest features on Windows.&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%2Fducg472tupu7ck4ci0kp.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%2Fducg472tupu7ck4ci0kp.png" alt="Bash • Zsh • PowerShell (Generated with Claude Design)" width="799" height="372"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  You Now Have the Foundation
&lt;/h2&gt;

&lt;p&gt;You understand operating systems. You know terminals and shells. You recognize that macOS and Linux speak the same language—UNIX—while Windows is fundamentally different, but that tools like WSL let you bridge that gap. You're not confused by terminology anymore.&lt;/p&gt;

&lt;p&gt;This knowledge is power. In the next tutorials in this series, you'll further grow it, and start using the tools of the trade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Editors, IDEs &amp;amp; Installing VS Code&lt;/strong&gt; — Understanding your tools and setting up your editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installing Terminal &amp;amp; WSL&lt;/strong&gt; — Setting up a development environment on Windows
(Windows only; macOS users skip this)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using VS Code with WSL&lt;/strong&gt; — Configuring your editor for development
(Windows only; macOS users skip this)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using the Terminal in VS Code&lt;/strong&gt; — Mastering the command line where your work happens
(all platforms going forward)&lt;/li&gt;
&lt;li&gt;And more, building toward full capability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you're on macOS, you already have a Unix-based terminal (bash/zsh) built in. You'll skip the Windows-specific setup articles and move straight to using the editor and terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters for AI-Assisted Development:&lt;/strong&gt; Comfort with the terminal and command line is a &lt;strong&gt;prerequisite&lt;/strong&gt; for using agentic AI tools like &lt;a href="https://www.anthropic.com/product/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; and &lt;a href="https://github.com/openclaw/openclaw" rel="noopener noreferrer"&gt;OpenClaw&lt;/a&gt;. These tools live in your terminal see your codebase, edit files, run commands, and handle version control—but they're not perfect, and you'll need to understand the fundamentals of CLIs.&lt;/p&gt;

&lt;p&gt;With each step you'll grow the understanding to navigate confidently, make informed decisions, and see the world opportunistically -- through the eyes of someone who possesses the technology.&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%2F8zeqqh6hm8adwa4a6ajz.gif" 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%2F8zeqqh6hm8adwa4a6ajz.gif" alt="Mind = blown" width="600" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sources / additional material:&lt;br&gt;
&lt;a href="https://web.archive.org/web/20240226110454/https://www.itprotoday.com/windows-78/nt-vsunix-one-substantially-better#close-modal" rel="noopener noreferrer"&gt;https://web.archive.org/web/20240226110454/https://www.itprotoday.com/windows-78/nt-vsunix-one-substantially-better#close-modal&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/about" rel="noopener noreferrer"&gt;https://docs.microsoft.com/en-us/windows/wsl/about&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.udemy.com/course/the-linux-command-line-bootcamp/" rel="noopener noreferrer"&gt;https://www.udemy.com/course/the-linux-command-line-bootcamp/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This article was revised &amp;amp; expanded with AI for the purpose of providing practical information. I have reviewed it for accuracy and edited it appropriately.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>bash</category>
      <category>wsl</category>
      <category>mentoring</category>
    </item>
  </channel>
</rss>
