<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Labby</title>
    <description>The latest articles on DEV Community by Labby (@labby).</description>
    <link>https://dev.to/labby</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1606694%2Fd9443cf7-7b8f-49bc-ab8c-3d83a7fe7a4e.jpg</url>
      <title>DEV Community: Labby</title>
      <link>https://dev.to/labby</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/labby"/>
    <language>en</language>
    <item>
      <title>Docker EXPOSE vs. Publish: Why Your Running Container Is Unreachable</title>
      <dc:creator>Labby</dc:creator>
      <pubDate>Mon, 07 Sep 2026 05:51:32 +0000</pubDate>
      <link>https://dev.to/labex/docker-expose-vs-publish-why-your-running-container-is-unreachable-390c</link>
      <guid>https://dev.to/labex/docker-expose-vs-publish-why-your-running-container-is-unreachable-390c</guid>
      <description>&lt;p&gt;Your Dockerfile contains &lt;code&gt;EXPOSE 8000&lt;/code&gt;. The container is running. &lt;code&gt;docker ps&lt;/code&gt; even lists &lt;code&gt;8000/tcp&lt;/code&gt;. Yet opening &lt;code&gt;http://localhost:8080&lt;/code&gt; gives you a connection error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;EXPOSE&lt;/code&gt; records a container port in the image's metadata. &lt;code&gt;docker run -p&lt;/code&gt; publishes a container port through an address and port on the Docker host. Neither instruction makes your application start listening.&lt;/strong&gt; These are three separate controls, and a working browser request depends on more than the first one.&lt;/p&gt;

&lt;p&gt;This guide uses one small HTTP server to reproduce three states: an unpublished port, a working published port, and a published port pointing at an unreachable listener. You will inspect each state before changing it, so the commands remain useful when your next container has a different application inside.&lt;/p&gt;

&lt;h2&gt;
  
  
  What EXPOSE, publish, and bind actually control
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Where it belongs&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;What it does not prove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EXPOSE 8000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dockerfile&lt;/td&gt;
&lt;td&gt;Records an intended container port&lt;/td&gt;
&lt;td&gt;That a server is running or a host port exists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p 127.0.0.1:8080:8000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Maps host loopback port 8080 to container port 8000&lt;/td&gt;
&lt;td&gt;That the application accepts that traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--bind 0.0.0.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Our Python server command&lt;/td&gt;
&lt;td&gt;Makes the application listen on all IPv4 interfaces inside its container&lt;/td&gt;
&lt;td&gt;That Docker publishes a host port&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Docker's &lt;a href="https://docs.docker.com/reference/dockerfile/#expose" rel="noopener noreferrer"&gt;Dockerfile reference&lt;/a&gt; explicitly separates exposing from publishing. An image can document a port without making it available through &lt;code&gt;localhost&lt;/code&gt; on the host. Conversely, an explicit &lt;code&gt;-p&lt;/code&gt; mapping can target a port that the Dockerfile never declared.&lt;/p&gt;

&lt;p&gt;For this example, read the publishing argument from left to right:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-p 127.0.0.1:8080:8000
   └ host IP  │    └ container port
              └ host port

Host request to 127.0.0.1:8080
    → Docker port mapping
    → container network interface, port 8000
    → HTTP server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two port numbers need not match. Use &lt;code&gt;8080&lt;/code&gt; in the host-side URL because that is the entrance you created; the server still listens on &lt;code&gt;8000&lt;/code&gt; inside the container. Docker documents this syntax in its &lt;a href="https://docs.docker.com/get-started/docker-concepts/running-containers/publishing-ports/" rel="noopener noreferrer"&gt;port publishing walkthrough&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prepare one server you can test from both sides
&lt;/h2&gt;

&lt;p&gt;You need a working Docker Engine, a terminal with a POSIX shell, &lt;code&gt;curl&lt;/code&gt;, and permission to run Docker commands. Check the engine before copying the example:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You should see both Client and Server information. A missing Server section or a daemon connection error is an environment problem to resolve first. This guide uses Linux containers on Docker's ordinary bridge network; it does not use &lt;code&gt;--network host&lt;/code&gt; or custom routing rules.&lt;/p&gt;

&lt;p&gt;The experiments and screenshots below were captured in a LabEx Ubuntu 22.04 instance VM with Docker Engine 20.10.21 on September 7, 2026. The image tag &lt;code&gt;python:3.12-alpine&lt;/code&gt; can change over time. The experiment concerns port behavior, rather than a specific Python patch release.&lt;/p&gt;

&lt;p&gt;If creating images and running named containers are new to you, the &lt;a href="https://labex.io/courses/docker-for-beginners" rel="noopener noreferrer"&gt;Docker for Beginners course&lt;/a&gt; includes &lt;strong&gt;Docker Run Command Parameters&lt;/strong&gt;, &lt;strong&gt;Custom Docker Images&lt;/strong&gt;, and &lt;strong&gt;Docker Networking Basics&lt;/strong&gt;. Those activities provide the surrounding practice for this example.&lt;/p&gt;

&lt;p&gt;Create an empty 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;docker-port-demo
&lt;span class="nb"&gt;cd &lt;/span&gt;docker-port-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save this as &lt;code&gt;index.html&lt;/code&gt;. The page deliberately has no application dependencies: if it loads, an HTTP request reached the server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Docker port demo&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;22px&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.6&lt;/span&gt; &lt;span class="n"&gt;system-ui&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;760px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12vh&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;32px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#18334a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f1f7fa&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;44px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.15&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#dcecf5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3px&lt;/span&gt; &lt;span class="m"&gt;9px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;DOCKER NETWORKING EXPERIMENT&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Your request reached the container.&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;This page is served by Python on container port &lt;span class="nt"&gt;&amp;lt;code&amp;gt;&lt;/span&gt;8000&lt;span class="nt"&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    Change the port mapping or listening address, then test the same request
    again.
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the same directory, save this as &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 docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.12-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /site&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; index.html .&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python", "-u", "-m", "http.server", "8000", "--bind", "0.0.0.0"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;WORKDIR&lt;/code&gt; selects the directory to serve, &lt;code&gt;COPY&lt;/code&gt; adds the page, and &lt;code&gt;CMD&lt;/code&gt; starts the process. The &lt;code&gt;-u&lt;/code&gt; option makes Python's output unbuffered, which helps when reading startup messages through container logs. The &lt;code&gt;EXPOSE&lt;/code&gt; line describes the port; the &lt;code&gt;http.server&lt;/code&gt; command is what opens the listener.&lt;/p&gt;

&lt;p&gt;Build the image:&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; port-demo &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python's &lt;a href="https://docs.python.org/3.12/library/http.server.html" rel="noopener noreferrer"&gt;HTTP server documentation&lt;/a&gt; explains the command-line bind option and cautions against using this server for production. Use this small static page for the experiment, not as a deployment template for a sensitive application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Experiment 1: EXPOSE without a published port
&lt;/h2&gt;

&lt;p&gt;Start the image without &lt;code&gt;-p&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;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; exposed-only port-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inspect the image metadata and the running 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 image inspect port-demo &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'{{json .Config.ExposedPorts}}'&lt;/span&gt;
docker ps &lt;span class="nt"&gt;--filter&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;exposed-only &lt;span class="nt"&gt;--format&lt;/span&gt; &lt;span class="s1"&gt;'table {{.Names}}\t{{.Ports}}'&lt;/span&gt;
docker port exposed-only
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The image records &lt;code&gt;{"8000/tcp":{}}&lt;/code&gt;, and the container's port column shows &lt;code&gt;8000/tcp&lt;/code&gt;. However, &lt;code&gt;docker port exposed-only&lt;/code&gt; produces no mapping. The &lt;a href="https://docs.docker.com/reference/cli/docker/container/port/" rel="noopener noreferrer"&gt;docker port reference&lt;/a&gt; defines this command as a mapping inspection tool; it is not an application health check.&lt;/p&gt;

&lt;p&gt;Try a request from the &lt;strong&gt;Docker host terminal&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;curl &lt;span class="nt"&gt;--max-time&lt;/span&gt; 3 http://127.0.0.1:8080/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It should fail if nothing else is listening on host port 8080. If it succeeds, inspect that other service before continuing: this container did not publish that address.&lt;/p&gt;

&lt;p&gt;Now make a request &lt;strong&gt;inside the container&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 &lt;span class="nb"&gt;exec &lt;/span&gt;exposed-only python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'import urllib.request; print(urllib.request.urlopen("http://127.0.0.1:8000").status)'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is &lt;code&gt;200&lt;/code&gt;. This test uses Python because the image already contains it; you do not need to install &lt;code&gt;curl&lt;/code&gt; inside the container.&lt;/p&gt;

&lt;p&gt;Together, the observations say something precise: the application answers HTTP internally, but this container has no host port mapping. They do not say that the application is inaccessible from every possible network location. On a Linux bridge, the host and other containers on the same bridge may reach a reachable container listener directly. Docker explains that distinction in its &lt;a href="https://docs.docker.com/engine/network/drivers/bridge/" rel="noopener noreferrer"&gt;bridge network documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Experiment 2: publish the host entrance
&lt;/h2&gt;

&lt;p&gt;Start a second container from exactly the same image:&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 &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; published &lt;span class="nt"&gt;-p&lt;/span&gt; 127.0.0.1:8080:8000 port-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the server starts, inspect and test it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker port published
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'Host HTTP status: %{http_code}\n'&lt;/span&gt; http://127.0.0.1:8080/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mapping is &lt;code&gt;8000/tcp -&amp;gt; 127.0.0.1:8080&lt;/code&gt;, and the request returns &lt;code&gt;Host HTTP status: 200&lt;/code&gt;. If a request made immediately after &lt;code&gt;docker run&lt;/code&gt; fails, check the logs and retry after startup; creating the container and accepting HTTP are separate events.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/assets/posts/docker-expose-vs-publish/expose-and-publish.png"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx72le8kzkgm8bl6tvfll.png" alt="A LabEx VM terminal showing an exposed-only container without a host mapping and a published container returning HTTP 200" width="798" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The same image, tested in a LabEx VM. Adding a host mapping changes the host request result without changing the Dockerfile.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can now open &lt;code&gt;http://127.0.0.1:8080&lt;/code&gt; in a browser &lt;strong&gt;on the Docker host&lt;/strong&gt;. If Docker runs in a remote VM, your laptop's browser is a different machine; use the remote-preview section below.&lt;/p&gt;

&lt;p&gt;Why specify &lt;code&gt;127.0.0.1&lt;/code&gt;? With Docker's default settings, omitting the host IP publishes on all host interfaces. Explicit loopback binding is the appropriate starting point for a local development example. It does not add authentication or encryption. Docker also documents a caveat for engines older than 28.0.0: another host on the same layer-2 network may reach a localhost-published port. Our older demonstration VM is not evidence that loopback publishing provides complete isolation. See Docker's &lt;a href="https://docs.docker.com/engine/network/port-publishing/" rel="noopener noreferrer"&gt;publishing and mapping security notes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Experiment 3: a mapping exists, but the listener is wrong
&lt;/h2&gt;

&lt;p&gt;Now keep port publishing and change only the application's listening address. Use host port 8081 so the working container can remain available for comparison:&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 &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; wrong-bind &lt;span class="nt"&gt;-p&lt;/span&gt; 127.0.0.1:8081:8000 &lt;span class="se"&gt;\&lt;/span&gt;
  port-demo python &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8000 &lt;span class="nt"&gt;--bind&lt;/span&gt; 127.0.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command after &lt;code&gt;port-demo&lt;/code&gt; replaces this image's default &lt;code&gt;CMD&lt;/code&gt;. Python now listens only on the &lt;strong&gt;container's&lt;/strong&gt; loopback interface.&lt;/p&gt;

&lt;p&gt;Check the mapping, then test from the host:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker port wrong-bind
curl &lt;span class="nt"&gt;--max-time&lt;/span&gt; 3 http://127.0.0.1:8081/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A mapping exists, yet the HTTP request fails. Depending on your engine and network implementation, the error may be a reset or another connection failure; the important observation is that you do not receive the page.&lt;/p&gt;

&lt;p&gt;Repeat the internal check:&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;wrong-bind python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'import urllib.request; print(urllib.request.urlopen("http://127.0.0.1:8000").status)'&lt;/span&gt;
docker logs &lt;span class="nt"&gt;--tail&lt;/span&gt; 5 wrong-bind
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The internal request returns &lt;code&gt;200&lt;/code&gt;, and the startup log identifies &lt;code&gt;127.0.0.1&lt;/code&gt; as the bind address.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/assets/posts/docker-expose-vs-publish/wrong-bind.png"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb78bura7bl4hqxz4pkxn.png" alt="A LabEx VM terminal showing a published port failing from the host while the loopback-only HTTP server returns 200 inside the container" width="800" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Port forwarding exists. The application is listening at the wrong address for traffic arriving through the container's network interface.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There are two different loopbacks here. &lt;code&gt;127.0.0.1&lt;/code&gt; in the publishing argument belongs to the host. &lt;code&gt;127.0.0.1&lt;/code&gt; in the Python command belongs to the container. Forwarded traffic arrives at the container's network interface, not its private loopback listener.&lt;/p&gt;

&lt;p&gt;For this server, restore &lt;code&gt;--bind 0.0.0.0&lt;/code&gt; by recreating the container with the image's default command:&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;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; wrong-bind
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; wrong-bind &lt;span class="nt"&gt;-p&lt;/span&gt; 127.0.0.1:8081:8000 port-demo
curl &lt;span class="nt"&gt;--retry&lt;/span&gt; 5 &lt;span class="nt"&gt;--retry-all-errors&lt;/span&gt; &lt;span class="nt"&gt;--retry-delay&lt;/span&gt; 1 http://127.0.0.1:8081/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This final read-only request retries startup connection failures, including resets. The &lt;a href="https://curl.se/docs/manpage.html#--retry-all-errors" rel="noopener noreferrer"&gt;&lt;code&gt;--retry-all-errors&lt;/code&gt; option&lt;/a&gt; requires curl 7.71.0 or newer; with an older curl, wait for the startup log and repeat the request manually.&lt;/p&gt;

&lt;p&gt;The host-side mapping can stay on &lt;code&gt;127.0.0.1&lt;/code&gt; while the application listens on &lt;code&gt;0.0.0.0&lt;/code&gt; &lt;strong&gt;inside&lt;/strong&gt; the container. These settings control different boundaries. &lt;code&gt;0.0.0.0&lt;/code&gt; is a listening address meaning all IPv4 interfaces in that network namespace, not the URL to type into your browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Viewing the page from a LabEx VM
&lt;/h2&gt;

&lt;p&gt;A remote experiment adds another step to the request path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your browser → LabEx web preview → VM port 8082
             → Docker mapping → container port 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the captured browser demonstration, we started a separate preview 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 &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; preview &lt;span class="nt"&gt;-p&lt;/span&gt; 8082:8000 port-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This mapping omits a host IP so the VM's preview service can reach it. In the LabEx environment, open a web preview for &lt;strong&gt;VM port 8082&lt;/strong&gt; and use the provided preview URL. The exact preview controls depend on the lab environment. Typing &lt;code&gt;localhost:8082&lt;/code&gt; into your laptop browser would target your laptop instead.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F71d59h8gr9ht16kjq59l.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F71d59h8gr9ht16kjq59l.png" alt="The example HTTP page served from a Docker container through a LabEx VM web preview" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The actual example page reached through the LabEx VM preview. The temporary environment URL is excluded from the capture.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Only the disposable static demo is being served here. On your own remote server, publishing on all interfaces changes who may reach the application; choose the host binding and any surrounding network controls deliberately. A successful &lt;code&gt;curl&lt;/code&gt; inside the VM followed by a failed external preview means you should inspect the preview port and intervening network path before editing &lt;code&gt;EXPOSE&lt;/code&gt; again.&lt;/p&gt;

&lt;h2&gt;
  
  
  A troubleshooting order that preserves the evidence
&lt;/h2&gt;

&lt;p&gt;When another container is unreachable, start with the closest observable boundary and work outward.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;How to interpret it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Is the container still running?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker ps -a --filter name=published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;An exited process needs log inspection before networking changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What did the application report?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker logs --tail 50 published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Look for startup errors, port numbers, and bind addresses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What command actually started?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker inspect published --format '{{json .Config.Cmd}}'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A runtime override may differ from the Dockerfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is there a host mapping?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker port published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No mapping means no published host entrance for this container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does HTTP work inside?&lt;/td&gt;
&lt;td&gt;Use the internal Python request above&lt;/td&gt;
&lt;td&gt;Success establishes internal HTTP response, not outside reachability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does HTTP work on the Docker host?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;curl -v --max-time 3 http://127.0.0.1:8080/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Failure with internal success narrows attention to mapping and bind address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does the remote browser use the same host and port?&lt;/td&gt;
&lt;td&gt;Compare its destination with the VM preview configuration&lt;/td&gt;
&lt;td&gt;A laptop localhost URL does not target a remote VM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href="https://docs.docker.com/reference/cli/docker/container/logs/" rel="noopener noreferrer"&gt;logs command&lt;/a&gt; retrieves container output, while &lt;a href="https://docs.docker.com/reference/cli/docker/container/inspect/" rel="noopener noreferrer"&gt;inspect&lt;/a&gt; returns configuration and state. Neither replaces a request to the actual endpoint. Some applications also write logs to files rather than standard output, so an empty &lt;code&gt;docker logs&lt;/code&gt; result is not proof that nothing happened.&lt;/p&gt;

&lt;p&gt;If Docker reports that a host port is already allocated, change the &lt;strong&gt;host&lt;/strong&gt; number, for example to &lt;code&gt;127.0.0.1:8083:8000&lt;/code&gt;, and use 8083 in your URL. Changing the container number to 8083 would point forwarding at a port where this server is not listening.&lt;/p&gt;

&lt;p&gt;An HTTP &lt;code&gt;404&lt;/code&gt; or &lt;code&gt;500&lt;/code&gt; is different from a connection failure: an HTTP server responded. Confirm you reached the intended service, then investigate its path or application behavior. Repeatedly rebuilding the image to add more &lt;code&gt;EXPOSE&lt;/code&gt; lines will not explain an HTTP error response.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions that come up next
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do I need EXPOSE if I already use -p?
&lt;/h3&gt;

&lt;p&gt;No. Explicit publishing does not require an &lt;code&gt;EXPOSE&lt;/code&gt; declaration. Keeping the declaration can still communicate the image's intended port to people and tools. It should agree with the application configuration, but it does not enforce that configuration.&lt;/p&gt;

&lt;p&gt;To test that distinction yourself, remove &lt;code&gt;EXPOSE 8000&lt;/code&gt;, build under a second tag, and run it with an explicit mapping on an unused host port. Avoid using a base image that already declares the same port if your experiment is intended to show the absence of exposed-port metadata.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between -p and -P?
&lt;/h3&gt;

&lt;p&gt;Lowercase &lt;code&gt;-p&lt;/code&gt; specifies a publication, such as &lt;code&gt;-p 127.0.0.1:8080:8000&lt;/code&gt;. Uppercase &lt;code&gt;-P&lt;/code&gt; publishes all exposed ports to automatically selected host ports. Inspect the resulting mappings rather than guessing the chosen numbers. Neither option changes the application's listening port or address.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Compose expose publish a port?
&lt;/h3&gt;

&lt;p&gt;No. For the working example, the equivalent host publication belongs under &lt;code&gt;ports&lt;/code&gt;:&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;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;port-demo&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:8080:8000"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stop the earlier &lt;code&gt;published&lt;/code&gt; container before starting this service, because both would otherwise claim host port 8080. The image must already exist on the Docker host for this example.&lt;/p&gt;

&lt;p&gt;Compose's &lt;code&gt;expose&lt;/code&gt; describes container ports without publishing them to the host. It is not a firewall between services. The official &lt;a href="https://docs.docker.com/reference/compose-file/services/" rel="noopener noreferrer"&gt;Compose services reference&lt;/a&gt; documents both fields and their different purposes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do two containers need published ports to communicate?
&lt;/h3&gt;

&lt;p&gt;Not when they can already communicate over the same user-defined bridge network. They can use a container name and the application's container port, such as &lt;code&gt;web:8000&lt;/code&gt;; the application still needs to listen on a reachable interface. Publishing is for the additional host entrance. Do not publish a database port merely because another container needs to talk to the database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clean up, then practice a different failure
&lt;/h2&gt;

&lt;p&gt;Remove only the containers created by this guide:&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;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; exposed-only published wrong-bind preview
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you skipped the preview step, Docker will report that &lt;code&gt;preview&lt;/code&gt; does not exist. If you tried the optional Compose example, stop it with &lt;code&gt;docker compose down&lt;/code&gt; from its project directory as well. Keep &lt;code&gt;port-demo&lt;/code&gt; if you want to repeat the experiments; otherwise remove that image with &lt;code&gt;docker image rm port-demo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For the next practice session, choose the gap your experiment exposed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If reading &lt;code&gt;docker run&lt;/code&gt; arguments was the hard part, work through &lt;a href="https://labex.io/labs/docker-docker-run-command-parameters-389228" rel="noopener noreferrer"&gt;Docker Run Command Parameters&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you want to extend the example to container networks, continue with &lt;a href="https://labex.io/labs/docker-docker-networking-basics-389048" rel="noopener noreferrer"&gt;Docker Networking Basics&lt;/a&gt; and &lt;a href="https://labex.io/labs/docker-docker-network-playground-389054" rel="noopener noreferrer"&gt;Docker Network Playground&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If addresses, processes, and service troubleshooting still feel disconnected, use the networking and service checkpoints in the &lt;a href="https://labex.io/blog/linux-learning-roadmap" rel="noopener noreferrer"&gt;Linux learning roadmap&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repeat the failed request before applying a fix, change one boundary, and repeat the same request afterward. The useful result is being able to explain which observation changed and why.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/reference/dockerfile/#expose" rel="noopener noreferrer"&gt;Dockerfile reference: EXPOSE&lt;/a&gt; — exposed-port metadata and its relationship to explicit publishing.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/get-started/docker-concepts/running-containers/publishing-ports/" rel="noopener noreferrer"&gt;Docker: Publishing and exposing ports&lt;/a&gt; — mapping syntax and automatically selected host ports.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/engine/network/port-publishing/" rel="noopener noreferrer"&gt;Docker: Port publishing and mapping&lt;/a&gt; — host binding scope and the pre-28.0.0 localhost caveat.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/engine/network/drivers/bridge/" rel="noopener noreferrer"&gt;Docker: Bridge network driver&lt;/a&gt; — communication within a bridge and name resolution on user-defined networks.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/reference/cli/docker/container/port/" rel="noopener noreferrer"&gt;Docker CLI: container port&lt;/a&gt; — inspect an existing port mapping.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/reference/cli/docker/container/logs/" rel="noopener noreferrer"&gt;Docker CLI: container logs&lt;/a&gt; and &lt;a href="https://docs.docker.com/reference/cli/docker/container/inspect/" rel="noopener noreferrer"&gt;container inspect&lt;/a&gt; — distinguish application output from container configuration.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.docker.com/reference/compose-file/services/" rel="noopener noreferrer"&gt;Docker Compose services reference&lt;/a&gt; — &lt;code&gt;ports&lt;/code&gt;, &lt;code&gt;expose&lt;/code&gt;, and service configuration.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://curl.se/docs/manpage.html#--retry-all-errors" rel="noopener noreferrer"&gt;curl manual&lt;/a&gt; — retry behavior for the post-startup verification request.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.12/library/http.server.html" rel="noopener noreferrer"&gt;Python 3.12: http.server&lt;/a&gt; — the demonstration server, bind address, and production limitations.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://labex.io/courses/docker-for-beginners" rel="noopener noreferrer"&gt;LabEx: Docker for Beginners&lt;/a&gt; — the related image, container, and networking practice sequence.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>networking</category>
      <category>linux</category>
    </item>
    <item>
      <title>Linux Learning Roadmap for 2026: From Your First Command to Running a Service</title>
      <dc:creator>Labby</dc:creator>
      <pubDate>Mon, 07 Sep 2026 05:51:05 +0000</pubDate>
      <link>https://dev.to/labex/linux-learning-roadmap-for-2026-from-your-first-command-to-running-a-service-2oma</link>
      <guid>https://dev.to/labex/linux-learning-roadmap-for-2026-from-your-first-command-to-running-a-service-2oma</guid>
      <description>&lt;p&gt;A service cannot read its configuration file. You can find the file and open it yourself, but restarting the service changes nothing. What would you inspect next: the path, the file's owner, the directory permissions, or the identity running the service?&lt;/p&gt;

&lt;p&gt;That question connects several parts of Linux that beginners often study separately. A useful learning roadmap should help you make those connections. Its checkpoints should tell you what you can now investigate and fix, not just which commands you have seen.&lt;/p&gt;

&lt;p&gt;The route below starts with a terminal and ends with maintaining a small service: checking its files, reading its logs, tracing a connection, and recovering a configuration. Use the checkpoints to choose your starting point. Looking up syntax is allowed; being able to explain and verify the change is the test.&lt;/p&gt;

&lt;h2&gt;
  
  
  The roadmap at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Learn to work with&lt;/th&gt;
&lt;th&gt;Move on when you can…&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Choose an environment&lt;/td&gt;
&lt;td&gt;Distribution, shell, user, system capabilities&lt;/td&gt;
&lt;td&gt;Identify where commands run and which administration tasks the environment supports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Navigate and edit&lt;/td&gt;
&lt;td&gt;Paths, help, files, directories, a text editor&lt;/td&gt;
&lt;td&gt;Find a configuration, edit a copy, and check exactly what changed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Control access&lt;/td&gt;
&lt;td&gt;Users, groups, ownership, file and directory permissions&lt;/td&gt;
&lt;td&gt;Give the intended identity access and verify the access boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process text&lt;/td&gt;
&lt;td&gt;Standard streams, pipes, filters, exit status&lt;/td&gt;
&lt;td&gt;Produce a repeatable report from a log file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inspect a running system&lt;/td&gt;
&lt;td&gt;Processes, packages, services, journals&lt;/td&gt;
&lt;td&gt;Use evidence to recover a failed service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trace connections&lt;/td&gt;
&lt;td&gt;Addresses, routes, DNS, listening sockets, SSH&lt;/td&gt;
&lt;td&gt;Separate a name-resolution problem from a connection or service problem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automate and recover&lt;/td&gt;
&lt;td&gt;Scripts, disk space, archives, scheduling&lt;/td&gt;
&lt;td&gt;Run a task reliably and restore a selected file from its backup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is a learning sequence, not a fixed number of weeks. If you already edit files and understand permissions, try those checkpoints and begin where your explanation breaks down. If a later task exposes a gap, return to the relevant stage.&lt;/p&gt;

&lt;p&gt;The scope is consistent with established introductory curricula. &lt;a href="https://www.lpi.org/our-certifications/exam-010-objectives/" rel="noopener noreferrer"&gt;LPI Linux Essentials&lt;/a&gt; includes files, permissions, archives, recovery, and simple scripts. The Linux Foundation's &lt;a href="https://training.linuxfoundation.org/training/introduction-to-linux/" rel="noopener noreferrer"&gt;Introduction to Linux&lt;/a&gt; also covers processes, networking, Bash, and local security. Neither source establishes a universal learning order; the order here follows the dependencies of the practice tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose an environment you can inspect
&lt;/h2&gt;

&lt;p&gt;Pick one Linux distribution for the main route. Ubuntu is a practical choice for following the package-management documentation linked below. Learn its conventions first, then compare another distribution when you have a reason to do so.&lt;/p&gt;

&lt;p&gt;A terminal is the interface you type into. A shell interprets your commands. The distribution supplies the operating-system environment and its package and configuration conventions. Open Bash for the examples in this article and inspect the environment:&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; /etc/os-release
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BASH_VERSION&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;id
pwd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Record the distribution, Bash version, current identity, and working directory. These details explain many differences between a tutorial and the system in front of you. A command that exists on one machine may need an additional package on another.&lt;/p&gt;

&lt;p&gt;On Windows, WSL is an option, including for some service-management practice. &lt;a href="https://learn.microsoft.com/en-us/windows/wsl/systemd/" rel="noopener noreferrer"&gt;Microsoft documents systemd support in WSL&lt;/a&gt;, with requirements and configuration that depend on the installation. Check the actual environment before assuming that a service command will work. For boot, disk, and recovery exercises, choose a disposable Linux VM that exposes the capabilities the exercise requires.&lt;/p&gt;

&lt;p&gt;Also distinguish a container from a complete VM. &lt;a href="https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/" rel="noopener noreferrer"&gt;Docker describes containers as isolated processes sharing a kernel&lt;/a&gt;. A container shell can be useful for file and scripting work, but its presence does not establish that you can manage a full guest's boot process or services.&lt;/p&gt;

&lt;p&gt;If you want a structured starting point, the &lt;a href="https://labex.io/learn/linux" rel="noopener noreferrer"&gt;LabEx Linux path&lt;/a&gt; links to Linux courses and practice. &lt;a href="https://labex.io/courses/quick-start-with-linux" rel="noopener noreferrer"&gt;Quick Start with Linux&lt;/a&gt; is the short entry route; choose a lab environment appropriate to the task as you progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  Navigate, edit, and check your changes
&lt;/h2&gt;

&lt;p&gt;Start with absolute and relative paths, hidden files, and the relationship between your current directory and a command's arguments. Practise finding help with &lt;code&gt;--help&lt;/code&gt; and &lt;code&gt;man&lt;/code&gt;. Learn enough of one editor to open, search, change, save, and exit a file.&lt;/p&gt;

&lt;p&gt;Build a small practice directory that you will reuse later. Run this once in a new Bash session; keep the terminal open for the subsequent examples. &lt;code&gt;mktemp&lt;/code&gt; creates a fresh directory rather than reusing an existing 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="nv"&gt;practice_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;mktemp&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$practice_dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; service/&lt;span class="o"&gt;{&lt;/span&gt;config,logs,backups&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'port=8080\n'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; service/config/app.conf
&lt;span class="nb"&gt;cp &lt;/span&gt;service/config/app.conf service/config/app.conf.before
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$practice_dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The configuration is a practice fixture, not a configuration format for an installed server. Open &lt;code&gt;app.conf&lt;/code&gt; in your editor and change the port to &lt;code&gt;8081&lt;/code&gt;. Then inspect the difference:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diff &lt;span class="nt"&gt;-u&lt;/span&gt; service/config/app.conf.before service/config/app.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explain which line changed and which file contains the original. A difference makes &lt;code&gt;diff&lt;/code&gt; return status 1; that is its way of reporting unequal inputs, not automatically a command failure.&lt;/p&gt;

&lt;p&gt;Your checkpoint is to locate this file from another working directory, edit a copy, and verify the result. If you cannot predict which path a command will touch, spend more time here before practising recursive operations.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://labex.io/courses/linux-for-noobs" rel="noopener noreferrer"&gt;Linux for Noobs course&lt;/a&gt; provides the main practice spine for this roadmap. Its public syllabus covers file operations and command help, then continues through permissions, text processing, processes, services, networking, scripting, and recovery. The exercises below are article examples, not reproductions of its lab instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understand which identity needs access
&lt;/h2&gt;

&lt;p&gt;Read &lt;code&gt;ls -l&lt;/code&gt; output in terms of owner, group, and everyone else. Then learn why directories have permission bits too. Directory search permission affects access through a path; reading a file involves more than the bits on that final file.&lt;/p&gt;

&lt;p&gt;In the practice directory, inspect both the file and its containing 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;id
ls&lt;/span&gt; &lt;span class="nt"&gt;-ld&lt;/span&gt; service service/config
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; service/config/app.conf
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 service/config/app.conf
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; service/config/app.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mode change gives the owner read and write permission and removes the group's and others' mode permissions. This is an appropriate exercise for an owner-only file. It does not prove that the same mode would work for a service running as another user.&lt;/p&gt;

&lt;p&gt;That distinction is the checkpoint: state which identity needs access, choose ownership and permissions to match, and test as that identity in an administration lab. Also test the identity that should lack access. Reading the file as your own user proves only your own access. Later, ACLs and mandatory access controls can add further constraints beyond ordinary mode bits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/lesson/file-permissions" rel="noopener noreferrer"&gt;Linux Journey's file-permissions lesson&lt;/a&gt; is a useful companion when you need to decode the permission string. Keep returning to the opening service problem: which user is actually trying to read the configuration?&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn output into a repeatable report
&lt;/h2&gt;

&lt;p&gt;Before learning long pipelines, understand standard output, standard error, and redirection. Learn a few filters well: &lt;code&gt;grep&lt;/code&gt; for selection, &lt;code&gt;cut&lt;/code&gt; or &lt;code&gt;awk&lt;/code&gt; for fields, and &lt;code&gt;sort&lt;/code&gt; with &lt;code&gt;uniq&lt;/code&gt; for grouping.&lt;/p&gt;

&lt;p&gt;Create a deliberately simple log fixture:&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;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'INFO started'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'ERROR config-unreadable'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'ERROR config-unreadable'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'ERROR connection-refused'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; service/logs/app.log

&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'$1 == "ERROR" { print $2 }'&lt;/span&gt; service/logs/app.log |
  &lt;span class="nb"&gt;sort&lt;/span&gt; |
  &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For this fixture, the report should count two &lt;code&gt;config-unreadable&lt;/code&gt; events and one &lt;code&gt;connection-refused&lt;/code&gt; event. It relies on a specific input format: a severity followed by a single-word event. Real logs may use timestamps, quoted fields, JSON, or multiline records; inspect the format before choosing a parser.&lt;/p&gt;

&lt;p&gt;Save the report in a file, add another event, and regenerate it. Check that the new count matches the input. Then try a missing input file and observe the error separately from the report.&lt;/p&gt;

&lt;p&gt;Exit status becomes important here. In Bash, a pipeline normally reports the last command's status. With &lt;code&gt;pipefail&lt;/code&gt;, a failure earlier in the pipeline can affect that result. Consult the &lt;a href="https://www.gnu.org/software/bash/manual/html_node/Pipelines.html" rel="noopener noreferrer"&gt;Bash pipeline documentation&lt;/a&gt; before treating an empty output file as proof of success.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspect processes, packages, services, and logs
&lt;/h2&gt;

&lt;p&gt;Now move from prepared files to a running system. Learn to identify a process, its owner, its command, and its resource use. Practise process termination in an exercise with a known target, and distinguish that process from unrelated work.&lt;/p&gt;

&lt;p&gt;Use the distribution's package manager to install software and inspect what is installed. &lt;a href="https://ubuntu.com/server/docs/how-to/software/package-management/" rel="noopener noreferrer"&gt;Ubuntu's package-management guide&lt;/a&gt; explains APT and related tools. Treat that as Ubuntu-specific guidance; RPM-based systems have a different toolchain.&lt;/p&gt;

&lt;p&gt;A service manager adds another layer: it manages a program according to a unit's configuration and lifecycle rules. On a systemd-based practice VM, select a service supplied by the exercise and inspect its status, recent journal entries, and unit configuration. Learn the difference between starting it now and enabling it for future activation at boot. The &lt;a href="https://www.freedesktop.org/software/systemd/man/latest/systemctl.html" rel="noopener noreferrer"&gt;systemctl manual&lt;/a&gt; explicitly distinguishes enabling from starting.&lt;/p&gt;

&lt;p&gt;Do not make restart the whole troubleshooting procedure. A useful investigation records the failure, reads the relevant log entry, identifies a cause, changes one thing, and checks the result. A unit's active state is only one check; the application must also do its intended job.&lt;/p&gt;

&lt;p&gt;Use &lt;a href="https://labex.io/labs/linux-recover-a-failed-service-725413" rel="noopener noreferrer"&gt;Recover a Failed Service&lt;/a&gt; as a practice destination. The checkpoint is an explanation of the cause and evidence that the recovered service works. If the task includes persistence across reboot, verify that separately in an environment designed for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trace a connection before changing the firewall
&lt;/h2&gt;

&lt;p&gt;A running process does not guarantee a reachable service. Learn enough addressing, routing, DNS, and ports to separate the layers. On a Linux system with the relevant tools installed, start with read-only inspection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip addr
ip route
ss &lt;span class="nt"&gt;-ltn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These answer different questions: which addresses exist, where packets are routed, and which TCP sockets are listening. A loopback listener and a listener on an external interface have different reachability. A firewall is another boundary; opening a port cannot make a nonexistent listener appear.&lt;/p&gt;

&lt;p&gt;For a lab-provided HTTP service, first test the intended local address and port, then the intended remote path. Check hostname resolution when using a name. A successful local request does not prove remote connectivity, and a failed ping alone does not establish that HTTP is unavailable.&lt;/p&gt;

&lt;p&gt;Next learn SSH login, key-based authentication, and file transfer. &lt;a href="https://ubuntu.com/server/docs/how-to/security/openssh-server/" rel="noopener noreferrer"&gt;Ubuntu's OpenSSH guide&lt;/a&gt; provides the client/server context and configuration guidance. Keep a working session available when an exercise changes remote-access configuration, and verify a new connection before relying on the change.&lt;/p&gt;

&lt;p&gt;The checkpoint is to explain whether a failure concerns name resolution, routing, listening, filtering, or the application response. The course exercise &lt;a href="https://labex.io/labs/linux-correct-a-service-bind-address-725411" rel="noopener noreferrer"&gt;Correct a Service Bind Address&lt;/a&gt; gives this stage a bounded practice target.&lt;/p&gt;

&lt;h2&gt;
  
  
  Automate a task and prove you can recover
&lt;/h2&gt;

&lt;p&gt;Turn the log report into a Bash script only after you understand its commands. Give it an input-path argument, quote expansions, check missing or unreadable inputs, and return a nonzero status on failure. Practise conditions, loops, and functions as the task needs them; &lt;a href="https://labex.io/courses/shell-for-beginners" rel="noopener noreferrer"&gt;Shell for Beginners&lt;/a&gt; offers additional exercises in those areas.&lt;/p&gt;

&lt;p&gt;Test an ordinary path, a path containing spaces, an empty log, and a missing file. &lt;a href="https://www.shellcheck.net/wiki/SC2086" rel="noopener noreferrer"&gt;ShellCheck's quoting explanation&lt;/a&gt; shows why unquoted expansion can change arguments through word splitting and globbing. Use the checker alongside execution tests. If you use an AI assistant to suggest a script, apply the same tests and explain the changes before adopting it.&lt;/p&gt;

&lt;p&gt;Before scheduling backups, learn to inspect filesystem capacity with &lt;code&gt;df&lt;/code&gt; and directory usage with &lt;code&gt;du&lt;/code&gt;. Understand where the archive will be written and whether there is room for it. Partitions, LVM, and boot recovery can wait for a deeper administration track.&lt;/p&gt;

&lt;p&gt;Back in the same practice directory, create an archive and restore into a separate 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;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; service/backups/config.tar.gz &lt;span class="nt"&gt;-C&lt;/span&gt; service/config app.conf
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-tzf&lt;/span&gt; service/backups/config.tar.gz
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; service/restore-check
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; service/backups/config.tar.gz &lt;span class="nt"&gt;-C&lt;/span&gt; service/restore-check
cmp service/config/app.conf service/restore-check/app.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For an unchanged source, &lt;code&gt;cmp&lt;/code&gt; should produce no output and return zero. That checks the recovered file's contents. It does not establish a complete backup policy, off-machine protection, or application recovery.&lt;/p&gt;

&lt;p&gt;Only then schedule the task using cron or, on an appropriate system, a systemd timer. Use explicit paths and capture failures: scheduled execution may not have the same working directory or environment as your interactive terminal. Verify an actual scheduled run, then restore a selected file. &lt;a href="https://labex.io/labs/linux-restore-a-configuration-from-backup-725409" rel="noopener noreferrer"&gt;Restore a Configuration from Backup&lt;/a&gt; is a focused next exercise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose a direction after the core checkpoints
&lt;/h2&gt;

&lt;p&gt;The 2026 part of this roadmap is its checked environment and resource guidance, not a new set of Linux fundamentals. Course listings and platform defaults can change; use the documentation for the system you actually run.&lt;/p&gt;

&lt;p&gt;For development, continue into Git, language environments, and containers. Your knowledge of paths, users, processes, ports, and logs gives you specific questions to ask when a containerized application fails.&lt;/p&gt;

&lt;p&gt;For system administration, deepen storage, boot recovery, network configuration, and security policy. If you choose certification, map your skills against its current objectives. The &lt;a href="https://www.redhat.com/en/services/training/ex200-red-hat-certified-system-administrator-rhcsa-exam" rel="noopener noreferrer"&gt;RHCSA EX200 page&lt;/a&gt; currently specifies RHEL 10 and includes areas such as LVM and SELinux beyond this core route. This article is not an exam-coverage claim.&lt;/p&gt;

&lt;p&gt;For security, continue with service exposure, access boundaries, and privileged automation. &lt;a href="https://labex.io/courses/linux-security-for-devsecops" rel="noopener noreferrer"&gt;Linux Security for DevSecOps&lt;/a&gt; lists exercises in those areas. Learn to inspect the running system before attempting to harden it.&lt;/p&gt;

&lt;p&gt;Before branching out, complete one small maintenance exercise without step-by-step instructions. In a disposable service lab, recover a broken configuration, verify the service's response at its intended address, generate an error report, and restore a selected file from backup. Keep a short record of the evidence, your change, and the verification. If you can explain all three, you have a concrete basis for the next stage.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://labex.io/learn/linux" rel="noopener noreferrer"&gt;LabEx Linux learning path&lt;/a&gt; — course and practice entry points; linked course syllabi were checked on September 7, 2026.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.lpi.org/our-certifications/exam-010-objectives/" rel="noopener noreferrer"&gt;LPI Linux Essentials objectives&lt;/a&gt; and &lt;a href="https://training.linuxfoundation.org/training/introduction-to-linux/" rel="noopener noreferrer"&gt;Linux Foundation Introduction to Linux&lt;/a&gt; — independent reference points for introductory scope.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/en-us/windows/wsl/systemd/" rel="noopener noreferrer"&gt;Microsoft: systemd in WSL&lt;/a&gt; and &lt;a href="https://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/" rel="noopener noreferrer"&gt;Docker: containers and VMs&lt;/a&gt; — environment capabilities and boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.gnu.org/software/bash/manual/html_node/Pipelines.html" rel="noopener noreferrer"&gt;GNU Bash pipelines&lt;/a&gt; and &lt;a href="https://www.freedesktop.org/software/systemd/man/latest/systemctl.html" rel="noopener noreferrer"&gt;systemctl&lt;/a&gt; — pipeline status and service-management semantics.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ubuntu.com/server/docs/how-to/software/package-management/" rel="noopener noreferrer"&gt;Ubuntu package management&lt;/a&gt; and &lt;a href="https://ubuntu.com/server/docs/how-to/security/openssh-server/" rel="noopener noreferrer"&gt;OpenSSH server&lt;/a&gt; — distribution-specific administration guidance.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.shellcheck.net/wiki/SC2086" rel="noopener noreferrer"&gt;ShellCheck SC2086&lt;/a&gt; — word splitting, globbing, and quoting examples.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.redhat.com/en/services/training/ex200-red-hat-certified-system-administrator-rhcsa-exam" rel="noopener noreferrer"&gt;Red Hat EX200 objectives&lt;/a&gt; — the boundary between this general route and RHEL certification preparation.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linux</category>
      <category>shell</category>
      <category>systemadministration</category>
    </item>
    <item>
      <title>Linux Journey, Rebuilt for Interactive Learning</title>
      <dc:creator>Labby</dc:creator>
      <pubDate>Tue, 01 Sep 2026 07:26:26 +0000</pubDate>
      <link>https://dev.to/labex/linux-journey-rebuilt-for-interactive-learning-4lmd</link>
      <guid>https://dev.to/labex/linux-journey-rebuilt-for-interactive-learning-4lmd</guid>
      <description>&lt;p&gt;The old Linux History page put almost everything on one screen: the lesson list on the left, the complete article in the middle, and exercises plus a quiz on the right. The material was available, but the learner had to decide how to move through it, where to pause, and whether one answer at the end was enough to check their understanding.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw11goygt6j1zwbeqc3yc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw11goygt6j1zwbeqc3yc.png" alt="The previous Linux Journey lesson page with a sidebar, full article, exercises, and a quiz" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The new Linux Journey starts one level earlier. A course page now shows the sequence of lessons, a short outcome for each lesson, and one place to start or resume the course.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgdclfxxoqgtvga5pvw6e.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgdclfxxoqgtvga5pvw6e.png" alt="The redesigned Getting Started course page with an ordered interactive syllabus" width="800" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That visual redesign supports a more important change: Linux Journey is no longer organized only as a collection of pages to read. Each lesson now runs as a small learning sequence built around explanation, a decision, feedback, and continuation.&lt;/p&gt;

&lt;h2&gt;
  
  
  From a Syllabus to Learning Mode
&lt;/h2&gt;

&lt;p&gt;The redesigned &lt;a href="https://labex.io/linuxjourney/courses/getting-started" rel="noopener noreferrer"&gt;Getting Started course&lt;/a&gt; presents its 11 lessons as an ordered path. Each entry names the lesson and states what it covers, so a learner can see how Linux History leads into distribution choices and individual distribution guides before opening the first page.&lt;/p&gt;

&lt;p&gt;Selecting &lt;strong&gt;Start Course&lt;/strong&gt; opens the lesson in learning mode. Instead of displaying the entire page at once, the player begins with the first meaningful block and reveals the lesson step by step. A progress bar shows how far the learner has moved through the current lesson, while the &lt;strong&gt;Continue&lt;/strong&gt; button provides a clear next action.&lt;/p&gt;

&lt;p&gt;Course and lesson progress can be saved for signed-in learners. Signing in is not required to study the lessons; it is used to keep completion state available across devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions Become Part of the Explanation
&lt;/h2&gt;

&lt;p&gt;The previous Linux History quiz asked one recall question after the article: who developed the Linux kernel? In the revised lesson, checks appear immediately after the ideas they depend on.&lt;/p&gt;

&lt;p&gt;After the lesson explains that rewriting UNIX in C made it portable, for example, the learner chooses among three possible consequences. Selecting an option produces feedback for that specific choice. An incorrect answer explains the mismatch with the preceding material; the correct answer reinforces the portability principle. The lesson continues only after the learner identifies the correct answer.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7cgiax15zyh0zskyystu.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7cgiax15zyh0zskyystu.png" alt="The new Linux History learning mode showing lesson progress and immediate feedback on a contextual question" width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These questions are comprehension checks, not claims that a learner has mastered Linux administration. Their job is narrower: interrupt passive scrolling at a useful moment and make the learner apply the explanation that just appeared.&lt;/p&gt;

&lt;p&gt;The same player also provides a completion view with the lesson outcomes, a link to the next lesson, and a way to learn the lesson again. This turns the lesson boundary into part of the course flow instead of leaving navigation in a separate sidebar.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Content Was Revised for the New Flow
&lt;/h2&gt;

&lt;p&gt;The interface could not create this experience by itself. The Linux Journey lessons were also migrated to a structure that the player can divide into meaningful steps.&lt;/p&gt;

&lt;p&gt;The revision preserved explanations, examples, images, and practice links when they were still accurate. It removed the old standalone exercise and quiz containers, moved useful material next to the topic it supports, and converted worthwhile questions into contextual single-choice checks. Each lesson now ends with a short summary of what the learner can explain or do.&lt;/p&gt;

&lt;p&gt;Across the current lesson collection, every lesson in all nine supported languages contains four or five of these checks. Each option includes feedback, and each question must be answerable from material taught earlier in the lesson. The structure is designed to test the current idea without requiring unstated Linux knowledge.&lt;/p&gt;

&lt;p&gt;The result is not a wholesale replacement of the original Linux Journey material. It is a new delivery structure for that material, with targeted revisions where a transition, explanation, or question needed to support the interactive sequence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Still Free, Still Open
&lt;/h2&gt;

&lt;p&gt;The redesigned &lt;a href="https://labex.io/linuxjourney" rel="noopener noreferrer"&gt;Linux Journey&lt;/a&gt; remains free to use, with no payment or account required to read the lessons. Creating a free account is optional and enables saved learning progress.&lt;/p&gt;

&lt;p&gt;The lesson content also remains open source in the &lt;a href="https://github.com/labex-labs/linuxjourney" rel="noopener noreferrer"&gt;official Linux Journey repository&lt;/a&gt;. It is published under the CC BY-SA 4.0 license, and the repository continues to accept community contributions to lessons and translations.&lt;/p&gt;

&lt;p&gt;You can start with &lt;a href="https://labex.io/linuxjourney/courses/getting-started" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt;, or inspect and improve the source material on &lt;a href="https://github.com/labex-labs/linuxjourney" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>linuxjourney</category>
      <category>opensource</category>
      <category>interactivelearning</category>
    </item>
    <item>
      <title>Best Vibe Coding Tools in 2026: 12 Builders and Coding Agents Compared</title>
      <dc:creator>Labby</dc:creator>
      <pubDate>Thu, 20 Aug 2026 00:59:53 +0000</pubDate>
      <link>https://dev.to/labex/best-vibe-coding-tools-in-2026-12-builders-and-coding-agents-compared-4kk5</link>
      <guid>https://dev.to/labex/best-vibe-coding-tools-in-2026-12-builders-and-coding-agents-compared-4kk5</guid>
      <description>&lt;p&gt;The moment a Vibe Coding tool impresses me most is also when I become most cautious. One prompt can produce a polished app screen, but a polished screen is not a passed requirement. What changed, whether another person can take over, and where the project can recover after a failed build usually become visible only in the next round.&lt;/p&gt;

&lt;p&gt;That is why I do not find a single ranking from first to twelfth useful. Replit, Lovable, Bolt, v0, Base44, and Google AI Studio are strongest when the job is to turn an idea into a running first version. Codex, Claude Code, Cursor, Windsurf, the GitHub Copilot app, and Google Antigravity make more sense when a project already exists and its files, commands, checks, and diffs need to be reviewed. The groups overlap, but their starting points remain different.&lt;/p&gt;

&lt;p&gt;The question I want to answer is not “Which tool is best?” It is “At this stage of the project, which kind of workflow would I choose, and what evidence would I need before continuing?”&lt;/p&gt;

&lt;h2&gt;
  
  
  Two kinds of tools
&lt;/h2&gt;

&lt;p&gt;I divide the products by their starting workflow, not by a permanent label attached to each brand.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;AI app builder&lt;/strong&gt; combines a prompt, project setup, live preview, and usually hosting. It is a practical starting point when no project exists and the first need is a runnable user path with little setup.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;AI coding agent&lt;/strong&gt; works more directly with project files, commands, tests, and version-control changes. It becomes more useful when a project already exists and the next decision depends on inspecting or changing that project within a controlled scope.&lt;/p&gt;

&lt;p&gt;An inline code assistant is a third mode, but it is outside this comparison. Inline completion is valuable when someone is already writing code; it does not provide the same end-to-end path as a builder or project agent.&lt;/p&gt;

&lt;p&gt;These modes are not levels in a progression from weak to strong. When an agent can touch more files and tools, I also have more to review. I usually start a bounded prototype with a builder and move to an agent only when the next task genuinely needs file-level control. &lt;a href="https://ailesson.io/courses/vibe-coding-for-beginners" rel="noopener noreferrer"&gt;AILesson's Vibe Coding for Beginners Course&lt;/a&gt; begins with the same distinction rather than prescribing a brand.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I compared them
&lt;/h2&gt;

&lt;p&gt;I used two evidence layers, checked on August 20, 2026.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Product-documented behavior&lt;/strong&gt; comes from current official documentation, support pages, and release notes. It explains the workflow a product offers, but does not prove that the product completed our task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observed project evidence&lt;/strong&gt; comes from a preserved build, test, change, or handoff record. It supports only the behavior that was actually checked.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only the Replit-to-Codex path can be traced through the preserved Community Book Swap Checklist project used in the AILesson Course. For the other ten products, I reviewed current official workflows; I do not present documentation review as if I completed the same hands-on test in every product. A feature page can establish Git sync, checkpoints, or browser testing, but not that one tool would complete the brief better than another.&lt;/p&gt;

&lt;p&gt;The observed project began with a bounded brief: build a mobile-first checklist with categories, completion state, filters, refresh persistence, a recoverable reset, and no real personal data. Its later coding-agent task was deliberately smaller: inspect one file-level dependency conflict, propose a bounded change, and preserve the existing application behavior.&lt;/p&gt;

&lt;p&gt;The project record separates passed, partially passed, failed, and untested requirements. I will not turn one variable model run into a permanent quality ranking. I use it to set the comparison standard: running behavior, actual file changes, command output, recovery path, handoff state, and publishing boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  My shortlist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start with Replit&lt;/strong&gt; when you want one workspace for planning, building, Preview, checkpoints, files, and publishing—and you are prepared to test the result inside that workspace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start with Lovable or v0&lt;/strong&gt; when visual iteration is the main uncertainty and a Git-backed handoff matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start with Bolt&lt;/strong&gt; when the priority is a browser-based web build with immediate execution, code access, version history, and GitHub as an exit path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start with Base44&lt;/strong&gt; when built-in data, authentication, permissions, and hosting remove more work than platform dependence creates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start with Google AI Studio&lt;/strong&gt; when Gemini capabilities, native Android generation, or Cloud Run deployment is central to the product rather than an incidental integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start with a coding agent&lt;/strong&gt;—Codex, Claude Code, Cursor, Windsurf, the GitHub Copilot app, or Google Antigravity—when a repository already exists and the next result must be a reviewable, testable change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a starting shortlist, not a set of permanent lanes. Builders are adding repositories and editors; coding agents are operating browsers and producing visual evidence. I would still choose around the project's next unresolved problem, not stay loyal to a category.&lt;/p&gt;

&lt;h2&gt;
  
  
  App builders
&lt;/h2&gt;

&lt;p&gt;If I have a bounded idea but no project, these are the six products I would inspect first. All reduce setup. What separates them is where the code lives, who owns the backend, how visual changes return to source, and what remains when the project leaves the platform.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Best starting fit&lt;/th&gt;
&lt;th&gt;Control and handoff&lt;/th&gt;
&lt;th&gt;Main watchpoint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Replit Agent&lt;/td&gt;
&lt;td&gt;A complete first app path in one workspace&lt;/td&gt;
&lt;td&gt;Files, Shell, checkpoints, Git, export, and publishing&lt;/td&gt;
&lt;td&gt;Preview success is not proof of a reproducible export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lovable&lt;/td&gt;
&lt;td&gt;Full-stack web apps with frequent visual refinement&lt;/td&gt;
&lt;td&gt;Source-connected visual edits and two-way GitHub sync&lt;/td&gt;
&lt;td&gt;Managed services still need a portability check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bolt&lt;/td&gt;
&lt;td&gt;Fast browser-based web and JavaScript projects&lt;/td&gt;
&lt;td&gt;Code view, version history, branches, and GitHub sync&lt;/td&gt;
&lt;td&gt;Token use grows with project size and iteration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;v0&lt;/td&gt;
&lt;td&gt;Design-led apps in the React and Vercel ecosystem&lt;/td&gt;
&lt;td&gt;Full editor, production-like Preview, commits, and PRs&lt;/td&gt;
&lt;td&gt;A strong first UI still needs behavioral testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Base44&lt;/td&gt;
&lt;td&gt;Apps that need data, login, permissions, and hosting&lt;/td&gt;
&lt;td&gt;Code view; ZIP and GitHub export on eligible plans&lt;/td&gt;
&lt;td&gt;More of the stack begins inside the platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google AI Studio Build&lt;/td&gt;
&lt;td&gt;Gemini-first web or native Android apps&lt;/td&gt;
&lt;td&gt;Live code editing, ZIP/GitHub export, Cloud Run deployment&lt;/td&gt;
&lt;td&gt;Data services and usage costs need separate checks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Replit: everything in one workspace
&lt;/h3&gt;

&lt;p&gt;Replit began as a browser-based coding environment and grew into a full-stack software-creation platform. &lt;a href="https://replit.com/blog/introducing-replit-agent" rel="noopener noreferrer"&gt;Replit Agent&lt;/a&gt;, introduced in 2024, added natural-language app creation and deployment. I put Replit first among the builders not because it wins every feature, but because it keeps building, running, and recovery evidence close together—and because it is the only builder here backed by a complete observed project record.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.replit.com/learn/build-with-agent" rel="noopener noreferrer"&gt;Replit Agent documentation&lt;/a&gt; describes planning, building, testing, and checkpoints in the same workspace. That integration matters for beginners because a failed requirement can be checked against the running Preview, project files, Shell, and an earlier checkpoint without immediately moving the project elsewhere.&lt;/p&gt;

&lt;p&gt;Agent can begin in Plan mode, then write across files, install dependencies, debug failures, and improve the app. Screenshots, files, and Canvas notes can supply visual or business context that a prompt does not express well. Replit also brings databases, authentication, Secrets, Git, and Deployments into the workspace, so a project can move from an empty starting point to a published app with persistent data without first assembling a local toolchain. Its checkpoints can cover code, Agent context, tasks, and connected database state rather than only a text diff.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbivpfw6buwrd46n3kn4w.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbivpfw6buwrd46n3kn4w.webp" alt="Replit Agent conversation beside a running app Preview during an official first-app walkthrough" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Replit's official first-app documentation, accessed August 20, 2026. The screenshot identifies the Agent-and-Preview workspace; it does not establish that a generated app passed its requirements.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Course run also exposed the limit of that convenience. A polished Preview did not prove a “no hidden external dependency” requirement. A file scan found unused Google Fonts links, and the focused export later proved reviewable but not independently buildable because workspace-level dependency information was missing. Replit was still useful; the evidence simply stopped short of reproducibility.&lt;/p&gt;

&lt;p&gt;If I need to get one user path running quickly and am willing to test inside the workspace, I would start with Replit. I would not treat “Download source” as proof of reproducibility, however. Exporting files and rebuilding the same state on another machine are separate checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lovable: visual editing with a managed backend
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://lovable.dev/gpt-engineer" rel="noopener noreferrer"&gt;Lovable grew out of the open-source &lt;code&gt;gpt-engineer&lt;/code&gt; project&lt;/a&gt; and its former commercial web product, GPT Engineer. It is now a natural-language full-stack web platform for non-technical builders and software teams. When my main uncertainty is “How many times will this interface change?” rather than “How should I design the architecture?”, Lovable makes my first shortlist.&lt;/p&gt;

&lt;p&gt;Lovable keeps visual editing, full-stack services, and source handoff on one path. &lt;a href="https://lovable.dev/blog/visual-edits" rel="noopener noreferrer"&gt;Visual Edits&lt;/a&gt; lets a user select an element in the running interface, adjust copy, color, and spacing, and write the result back to source. When the app needs dynamic data, Lovable Cloud provides a PostgreSQL database, authentication, Storage, Realtime, and Edge Functions; Supabase remains another supported route. Authenticated external APIs use Secrets and server-side functions instead of exposing credentials in the browser.&lt;/p&gt;

&lt;p&gt;Its distinctive combination is visual selection plus two-way GitHub sync: a visual change does not remain an isolated mockup, and the code can enter a conventional branch and collaboration workflow. Publishing creates an explicit snapshot, so later editor changes do not silently replace the live version. Eligible Cloud projects can also separate Test and Live data and configuration.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb5b1sccm0jumwce1grj7.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb5b1sccm0jumwce1grj7.webp" alt="Lovable Visual Edits panel beside a selected element in the running app" width="800" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Lovable Visual Edits article, March 13, 2025. It shows the visual editing surface, not the quality or portability of the resulting code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;New Lovable apps created since May 13, 2026 use TanStack Start with server-side rendering; older apps remain React and Vite projects, with different hosting requirements. I would keep Lovable for web apps with frequent visual change and an early need for login or data. If easy migration is a hard requirement, I would not stop after finding code in GitHub; I would trace how the database, users, files, and Secrets move as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  v0: from interface generation to full projects
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://v0.app/docs" rel="noopener noreferrer"&gt;v0 is Vercel's AI development agent&lt;/a&gt;, originally known for generating React interfaces and components. It has since expanded into full-stack project work while retaining a design-first connection to Vercel. I would compare it directly with Lovable: both suit visual iteration, while v0's strongest path runs through React, GitHub, and Vercel.&lt;/p&gt;

&lt;p&gt;v0 can turn text, wireframes, or screenshots into high-fidelity interfaces, then work on frontend code, API routes, and database integrations in a full VS Code-style editor. &lt;a href="https://v0.app/docs/design-mode" rel="noopener noreferrer"&gt;Design Mode&lt;/a&gt; lets a user select an element in the real Preview and adjust it with controls or natural-language instructions. Applying the edit creates a new project version, so the resulting source can be diffed, reverted, or refined.&lt;/p&gt;

&lt;p&gt;Its Vercel and GitHub workflow is the defining feature. A Project shares deployments, domains, environment variables, and integrations across multiple chats. Once GitHub is connected, each chat works on a dedicated branch, code-changing messages create commits automatically, and the result enters &lt;code&gt;main&lt;/code&gt; through a pull request rather than a direct push. Database integrations include Neon, Supabase, and Upstash.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9qr52ge6sovehdnyulef.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9qr52ge6sovehdnyulef.webp" alt="The Design Mode control in the v0 prompt bar" width="616" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official v0 documentation, accessed August 20, 2026. This cropped screenshot locates Design Mode; use the resulting project diff—not the control itself—to judge the change.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When React and Vercel are already decided and the project depends on a landing page, dashboard, or precise UI, I would rank v0 highly. The same integration defines its boundary: an unusually direct Vercel deployment does not prove that another host needs no adjustment. I would still test forms, permissions, data, and failure states after the first screen looks right.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bolt: the browser is the JavaScript runtime
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://blog.stackblitz.com/posts/bolt-100k-oss-fund/" rel="noopener noreferrer"&gt;Bolt.new is StackBlitz's AI app builder&lt;/a&gt;. It builds on WebContainers, a WebAssembly environment that runs a Node.js toolchain inside the browser instead of streaming a remote development machine. That is why Bolt deserves its own slot: the promise is not merely generated code, but code that can install, start, and fail visibly in the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://support.bolt.new/get-started/quickstart" rel="noopener noreferrer"&gt;Bolt's quickstart&lt;/a&gt; places the prompt, code editor, browser runtime, and Preview in one path. Its central feature is the in-browser development runtime: the agent can create files, install npm packages, start a Node.js service, observe runtime failures, and continue fixing them without a local project setup. If the initial prompt explicitly requests a mobile app, Bolt can also produce an Expo-compatible project.&lt;/p&gt;

&lt;p&gt;Bolt Cloud adds an automatically provisioned database, user authentication, Secrets, Edge Functions, and hosting, including a shareable &lt;code&gt;bolt.host&lt;/code&gt; address. A database can also be claimed and managed through Supabase. Code View, version history, and the &lt;a href="https://support.bolt.new/integrations/git" rel="noopener noreferrer"&gt;GitHub integration&lt;/a&gt; expose the implementation and provide a handoff path.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F42ht0tbso6pwy9xfp8u6.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F42ht0tbso6pwy9xfp8u6.webp" alt="Bolt start screen with a natural-language app request in the prompt box" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Bolt quickstart, accessed August 20, 2026. It shows the prompt-led starting point, not a completed task result.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I would use Bolt for a JavaScript or Node.js prototype when “run it now” matters more than merely receiving source. I would not treat it as a cloud IDE for arbitrary backend languages: PHP and Python are outside the documented runtime, and repeated iterations keep consuming tokens. I would settle the stack and budget before starting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Base44: the backend is already there
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://base44.com/about-us" rel="noopener noreferrer"&gt;Base44 is a natural-language app builder now operated by Wix&lt;/a&gt;. It resembles an integrated business-app platform more than a design-only generator: data, identity, backend logic, and hosting are present by default. I would reach for it when evaluating a CRM, internal tool, or membership app—not for a static landing page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.base44.com/Getting-Started/Quick-start-guide" rel="noopener noreferrer"&gt;Base44's quickstart&lt;/a&gt; also begins with a prompt and live Preview, but its center of gravity is a ready-made backend for business applications. Its NoSQL database represents models as entities and supports realtime subscriptions plus row- and field-level permissions. Authentication covers email/password, common social providers, and SSO. Custom backend logic runs as Deno and TypeScript serverless functions.&lt;/p&gt;

&lt;p&gt;Base44 divides integrations into several layers. Built-in actions generate text or images, send email, and process files; connectors use OAuth for accounts such as Google Workspace or Slack; custom integrations can be generated from an OpenAPI description and proxied through the backend so browser code never receives the credential. CRM tools, internal applications, member systems, and workflow-heavy apps make better use of these features than a static marketing page.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjt1yfqz1ew7muwvx6i2a.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjt1yfqz1ew7muwvx6i2a.webp" alt="Base44 AI chat beside a live app Preview in the builder" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Base44 documentation, accessed August 20, 2026. The screenshot shows the chat-and-Preview layout; integrated services and export still require separate checks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Its &lt;a href="https://docs.base44.com/documentation/building-your-app/developer-tools" rel="noopener noreferrer"&gt;developer tools&lt;/a&gt; include a React/Vite code view, API Activity Monitor, GitHub workflow, ZIP export, and local-development path; built-in hosting supplies HTTPS and custom domains. I would inspect what “export” means here: moving the frontend and functions does not automatically move the database, authentication, integrations, or Base44 SDK. I would consider Base44 when the team accepts platform dependence in exchange for less setup, not when complete self-hosting is the first constraint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google AI Studio: when Gemini is the product
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/aistudio-build-mode" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt; began as Google's browser environment for experimenting with Gemini prompts. Build mode has expanded it into web and native Android development. I would not make it a general default simply because it can now build apps; its integration becomes distinctive when Gemini, native Android, or Cloud Run is already central to the product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/aistudio-build-mode" rel="noopener noreferrer"&gt;Google's current Build documentation&lt;/a&gt; makes AI Studio more than a playground for Gemini prompts. Web mode creates a React frontend and Node.js server runtime, supports npm packages and network-accessible databases, and places the Gemini API key in server-side Secrets. The Antigravity Agent manages changes across project files and verifies updates. A project can move to GitHub or a ZIP archive, or deploy directly to Cloud Run.&lt;/p&gt;

&lt;p&gt;Android mode generates a native Kotlin and Jetpack Compose project with an in-browser emulator, physical-device installation, and a Play testing path. That is a meaningful distinction from most web-first builders. Android projects are currently client-side, however, so the server runtime and Secrets available to web apps do not transfer automatically.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwzfblyny45phjhq04psn.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwzfblyny45phjhq04psn.webp" alt="Google AI Studio Build screen for choosing Gemini-powered app capabilities" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Google AI Studio product image from October 2025. It shows the Build entry surface; the surrounding capability claims were rechecked on August 20, 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I would seriously consider this route when Gemini text, image, or Live API behavior is the app itself, or when native Android and Cloud Run are explicit targets. A shared AI Studio app lets authorized recipients view and fork its code, their Gemini calls consume the creator's quota, and databases remain external services. I would verify “Gemini was easy to add” separately from “data, cost, and handoff are clear.”&lt;/p&gt;

&lt;h2&gt;
  
  
  When I switch to an agent
&lt;/h2&gt;

&lt;p&gt;I would not move a project to a more technical-looking agent simply because two prompts failed. A tool change should resolve a specific control problem; otherwise it only moves the same vague request into a different input box.&lt;/p&gt;

&lt;p&gt;In the Course project, the reason to move was concrete: the visible app could not settle a file-level dependency question. The working state was preserved, the relevant files were exported, and Codex was asked to inspect before editing. It proposed deleting exactly three unused font-related lines, while leaving application behavior and every other file outside the approved scope.&lt;/p&gt;

&lt;p&gt;That Replit-to-Codex sequence is covered step by step in &lt;a href="https://ailesson.io/courses/vibe-coding-for-beginners" rel="noopener noreferrer"&gt;Vibe Coding for Beginners&lt;/a&gt;. Its value here is not promotional proof that those two brands win the comparison. It provides a real example of the threshold: switch tools when the next claim requires a different kind of evidence and control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coding agents
&lt;/h2&gt;

&lt;p&gt;Once a repository exists, I expect more from an agent. “Task complete” carries little information. I want to see the plan, permission boundary, changed files, diff, command results, behavioral retest, and recovery path.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Best starting fit&lt;/th&gt;
&lt;th&gt;Review and recovery surface&lt;/th&gt;
&lt;th&gt;Main watchpoint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;Bounded or multi-step work in an existing local project&lt;/td&gt;
&lt;td&gt;Plans, commands, checks, changed files, and diff review&lt;/td&gt;
&lt;td&gt;Broad permissions require an explicit scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Terminal-first repository work&lt;/td&gt;
&lt;td&gt;Plan mode, permission modes, commands, tests, and Git&lt;/td&gt;
&lt;td&gt;The operator must be comfortable reading command output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor Agent&lt;/td&gt;
&lt;td&gt;Agent work alongside everyday editor navigation&lt;/td&gt;
&lt;td&gt;File-by-file diff review, selective acceptance, checkpoints&lt;/td&gt;
&lt;td&gt;Checkpoints cover Agent edits, not permanent history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windsurf Cascade&lt;/td&gt;
&lt;td&gt;Editor-local work plus Windsurf 2.0 agent orchestration&lt;/td&gt;
&lt;td&gt;Plans, tool calls, diagnostics, checkpoints, and reverts&lt;/td&gt;
&lt;td&gt;The product surface now spans Cascade and Devin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Copilot app&lt;/td&gt;
&lt;td&gt;Parallel local or cloud sessions around repositories&lt;/td&gt;
&lt;td&gt;Interactive/Plan/Autopilot modes and isolated workspaces&lt;/td&gt;
&lt;td&gt;Autonomy, isolation, and billing vary by run mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Antigravity&lt;/td&gt;
&lt;td&gt;Work that benefits from plans and visual proof&lt;/td&gt;
&lt;td&gt;Reviewable artifacts, diffs, screenshots, and recordings&lt;/td&gt;
&lt;td&gt;More artifacts help only when tied to requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Codex: work organized around reviewable changes
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://developers.openai.com/codex/" rel="noopener noreferrer"&gt;Codex is OpenAI's coding agent&lt;/a&gt;, designed to understand codebases, build and test features, fix bugs, and review changes. It is available across desktop, CLI, IDE, and cloud surfaces rather than being tied to one editor. In this comparison, I care less about the number of entry points than about keeping task scope, commands, and the final diff in one review chain.&lt;/p&gt;

&lt;p&gt;The Codex workflow centers on editing files, running commands and checks, and reviewing the resulting diff. A local environment can work directly on the current working tree, a Git worktree can isolate parallel changes, and a cloud environment can hand a task to a remote sandbox. The integrated terminal and Review surface keep command output, changed files, and line-level diffs attached to one task.&lt;/p&gt;

&lt;p&gt;Repository conventions and repeated procedures can be encoded in &lt;code&gt;AGENTS.md&lt;/code&gt;, Skills, and Plugins so lint, test, documentation, or release rules do not need to be restated in every prompt. Permissions and sandbox settings govern which files, networks, and external tools the agent can reach. As that extension surface grows, the requested goal, protected areas, and acceptance commands need to become more explicit.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F91uqdyilbgkjtzekjv0v.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F91uqdyilbgkjtzekjv0v.webp" alt="Codex desktop with a bounded change request and a Review pane showing three deleted Google Fonts lines" width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Course-prepared Codex desktop demonstration reconstructed from the preserved project and exact three-line diff. It shows the recorded review action, not the original execution screen.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the Course record, what I could verify was not “the project is fixed,” but a bounded three-line deletion compared with the preserved original. I would consider Codex for a bug fix, refactor, test, review, or verifiable multi-step task in an existing repository. With only a product idea and no project structure, I would start with a builder instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code: terminal-first and highly extensible
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://code.claude.com/docs/en/how-claude-code-works" rel="noopener noreferrer"&gt;Claude Code is Anthropic's agentic coding environment&lt;/a&gt;. It began in the terminal, with a harness that supplies project context, tools, permissions, and an execution loop, and now also spans desktop, IDE, web, and automation. If I already read shell commands and Git diffs comfortably and want to wire my own engineering rules into the agent loop, it feels more natural than a fixed builder interface.&lt;/p&gt;

&lt;p&gt;Claude Code includes tools for file operations, code search, shell commands, Git, web lookup, and code diagnostics. Its loop gathers context, acts, and verifies. Plan mode limits exploration to read-only tools; Default and Auto-accept modes adjust which edits and commands require approval. A checkpoint taken before each file edit can be restored with double &lt;code&gt;Esc&lt;/code&gt; or &lt;code&gt;/rewind&lt;/code&gt;, but remote database, deployment, and API side effects are outside that recovery mechanism.&lt;/p&gt;

&lt;p&gt;The product is more than a terminal chat pane. &lt;code&gt;CLAUDE.md&lt;/code&gt; carries persistent project conventions, Skills package on-demand workflows, MCP connects external services, Hooks run deterministic scripts around tool and session events, and Subagents or Agent Teams move work into separate contexts. This is useful for teams already comfortable with CLI workflows and interested in wiring engineering rules into the agent loop. Each extension also adds context, permission, or maintenance overhead.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftv34obbf1ehf5ti8b2o7.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftv34obbf1ehf5ti8b2o7.webp" alt="Claude Code terminal showing a project prompt and recent file activity" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Anthropic product screenshot, accessed August 20, 2026. It identifies the terminal workflow; it does not verify a particular repository change.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I would not discount Claude Code because the terminal lacks a permanent visual Preview, or overrate it because the interface looks technical. The workflow works for me only if I can read proposed commands, inspect the Git diff, and distinguish local checkpoints from durable version history.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cursor: a gradual path from completion to agents
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cursor.com/blog/series-b" rel="noopener noreferrer"&gt;Cursor is an AI-first code editor created by Anysphere&lt;/a&gt;. It began with codebase-aware chat, completion, and editing, then expanded toward foreground and cloud agents. Its most useful distinction is not simply that it “has an agent,” but that I can raise the autonomy level gradually—from completion to a focused edit to a larger delegated task.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cursor.com/en/get-started/quickstart" rel="noopener noreferrer"&gt;Cursor's current workflow&lt;/a&gt; covers three different scales of assistance. Tab predicts multi-line and cross-file completions, Inline Edit changes selected code, and &lt;a href="https://docs.cursor.com/chat/overview" rel="noopener noreferrer"&gt;Agent&lt;/a&gt; searches the codebase, edits multiple files, runs terminal commands, and fixes errors. Ask mode is read-only, Manual mode only edits explicitly selected files, and Custom modes combine selected tools with specialized instructions. A developer does not have to start a high-autonomy task for every small change.&lt;/p&gt;

&lt;p&gt;Review Diffs supports file-by-file inspection, Rules preserve project conventions, and MCP connects external tools. &lt;a href="https://docs.cursor.com/en/agent/chat/checkpoints" rel="noopener noreferrer"&gt;Checkpoints&lt;/a&gt; automatically save Agent-made file changes. For work away from the local machine, Background Agents clone a GitHub repository into an isolated Ubuntu environment, install dependencies, run tests, and push a separate branch; web, mobile, and Slack surfaces can start or follow those runs.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr8trw73csdx8ptk9xvjv.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr8trw73csdx8ptk9xvjv.webp" alt="Cursor Agent workspace with a conversation, changed files, and code review panes" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Cursor documentation image, accessed August 20, 2026. It shows the Agent review surface, not whether the displayed change is correct.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If I already read and change code in an editor and want to move gradually between completion and agent work, Cursor is a natural fit. Its local checkpoints cover only Agent changes, omit manual edits, and are cleaned up automatically, so I would not substitute them for Git. Because background environments have internet access and auto-run commands, I would review repository permissions, Secrets, and prompt-injection exposure separately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Windsurf: the two-layer Cascade and Devin workflow
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://windsurf.com/switch/cursor" rel="noopener noreferrer"&gt;Windsurf is Cognition's agentic IDE&lt;/a&gt;, developed alongside the company's autonomous cloud agent, Devin. This explains its two-layer design: synchronous work with Cascade inside the editor, plus longer tasks delegated to cloud agents. That orchestration is attractive when I need to watch several tasks, but potentially excessive for one small repository change.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://windsurf.com/switch/cursor" rel="noopener noreferrer"&gt;Windsurf 2.0&lt;/a&gt; still begins with the editor. Cascade sits beside the codebase, plans tasks, searches and edits files, calls tools, reads diagnostics, and uses checkpoints and reverts when a change goes wrong. The editor offers models from several providers. Code Maps visualize relationships across files and symbols, while Preview lets web changes run in the same environment where they were made.&lt;/p&gt;

&lt;p&gt;The defining 2.0 addition is Agent Command Center. Its Kanban view collects local and cloud agents, while Spaces organize sessions, pull requests, files, and context by project. A plan made with a local agent can be handed to Devin, which continues in its own VM with a desktop, browser, and terminal. Windsurf therefore serves both immediate editor pairing and longer background work instead of being only a chat panel beside code.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvf488373o6ozdihgp053.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvf488373o6ozdihgp053.webp" alt="Windsurf editor with the Cascade panel open beside a project workspace" width="799" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Cascade documentation image, accessed August 20, 2026. It locates the agent inside the editor; the current Windsurf 2.0 surface also includes broader Devin integration.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The local-Cascade and cloud-Devin combination is attractive when I need to move several tasks at once, but it also makes permissions and billing harder to read at a glance. Local editing, remote execution, model choice, and usage limits may not follow one set of rules. I would check checkpoint scope before restoring and confirm repository, network, and credential boundaries before a cloud handoff.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Copilot app: sessions inside the GitHub workflow
&lt;/h3&gt;

&lt;p&gt;GitHub Copilot first became familiar as code completion inside an editor. The standalone &lt;a href="https://github.blog/changelog/2026-06-17-github-copilot-app-generally-available/" rel="noopener noreferrer"&gt;GitHub Copilot app became generally available in June 2026&lt;/a&gt;, shifting the unit of work from a suggestion to a branch, issue, or pull request. I see its clearest audience not as every GitHub user, but as teams already organized around issues and PRs that now want several sessions running in parallel.&lt;/p&gt;

&lt;p&gt;Each session can run in its own Git worktree, the current local repository, or a GitHub-hosted cloud sandbox, with a dedicated branch. Several tasks can progress without competing for one working tree, and an issue can move directly into implementation, diff review, commit, and pull-request work.&lt;/p&gt;

&lt;p&gt;Interactive mode pauses for collaboration, Plan mode presents a plan for approval, and Autopilot can write code, run tests, and iterate without waiting. Each session can use a different model and reasoning effort; Auto selects a model based on the task, and external providers can be added with the user's own API key. An integrated terminal, browser tools, Quick Chat, and session history support execution and review.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmf275lc1shlzztlz5e9y.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmf275lc1shlzztlz5e9y.webp" alt="GitHub Copilot app with agent sessions, task progress, and a project workspace" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official GitHub announcement, June 17, 2026. It shows the standalone Copilot app, rather than inline completion in an editor.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If the code is already on GitHub and everyday work revolves around issues and pull requests, I would test the Copilot app early. Local worktrees, direct local folders, and cloud sandboxes still have different isolation, resource access, and cost boundaries. Autopilot can proceed without waiting; I would still perform the final review.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Antigravity: plans and screenshots as review artifacts
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://developers.googleblog.com/en/build-with-google-antigravity-our-new-agentic-development-platform/" rel="noopener noreferrer"&gt;Google introduced Antigravity in November 2025&lt;/a&gt; as an agent-first platform spanning the editor, terminal, and browser. Antigravity 2.0 added a standalone command center while retaining IDE, CLI, and SDK surfaces. It makes my shortlist not because it has many entry points, but because plans, diffs, screenshots, and recordings become commentable deliverables.&lt;/p&gt;

&lt;p&gt;The standalone app centrally launches and monitors multiple local agents and scheduled tasks; Antigravity IDE lets agents use the editor, terminal, and browser. The distinctive comparison point is not the number of entry points but the way artifacts become part of the control loop.&lt;/p&gt;

&lt;p&gt;Before coding, an agent can create an Implementation Plan and Task List that accept document-style comments. During implementation it produces code diffs, and after completion a Walkthrough describes the changes and tests. A browser subagent can click through the app and attach screenshots or a recording. Google's &lt;a href="https://codelabs.developers.google.com/getting-started-google-antigravity" rel="noopener noreferrer"&gt;official Codelab&lt;/a&gt; also shows point-in-time Undo and the ability to send an IDE diagnostic or selected terminal failure to the agent.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0kyd0ylkpqguxeaqe8y8.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0kyd0ylkpqguxeaqe8y8.webp" alt="Google Antigravity conversation presenting an Implementation Plan and a Proceed control" width="799" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Google Antigravity Codelab, accessed August 20, 2026. It shows a plan awaiting review; it does not prove the later implementation matched that plan.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I would shortlist Antigravity when UI behavior must be verified in a browser or when I want plan and visual evidence beside the source change. More artifacts do not automatically mean stronger proof, and some policies let an agent continue without waiting for Proceed. I would still map the plan, diff, screenshot, and recording back to the brief one by one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the price hides
&lt;/h2&gt;

&lt;p&gt;I left monthly prices out of the main tables because they create false comparability. The products meter subscription access, messages, credits, tokens, model usage, compute, deployments, or some combination. A low advertised monthly price can still produce an interrupted run; a higher plan may include model or compute credit that another product bills separately.&lt;/p&gt;

&lt;p&gt;Before choosing a plan, compare three facts instead of a single advertised monthly price:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the lowest plan that includes the workflow you need, such as full builds, Git export, background agents, or cloud sandboxes;&lt;/li&gt;
&lt;li&gt;the unit that is actually metered—tokens, credits, messages, model calls, compute, or agent effort; and&lt;/li&gt;
&lt;li&gt;separate hosting, database, model, or deployment charges that continue after generation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Check the official pricing and checkout surface immediately before paying. A fair cost test records spend for your own bounded task; it does not assume that a plan with the lowest headline price will finish it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two tools I left out
&lt;/h2&gt;

&lt;p&gt;I did not retain historically prominent tools after they lost their new-user path. Firebase Studio disabled new workspace creation and user signup on June 22, 2026, ahead of its March 22, 2027 shutdown, and directs new work toward Google AI Studio or Antigravity. &lt;a href="https://firebase.google.com/docs/studio/migrating-project" rel="noopener noreferrer"&gt;Firebase's migration documentation&lt;/a&gt; makes it unsuitable as a new-user recommendation.&lt;/p&gt;

&lt;p&gt;GitHub Spark also stopped accepting new users and new applications in August 2026. &lt;a href="https://docs.github.com/en/copilot/concepts/spark" rel="noopener noreferrer"&gt;GitHub's current Spark documentation&lt;/a&gt; tells existing users to export their work. Both products may still matter in a history of the category, but neither should occupy a main comparison slot for someone choosing a tool now.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I would choose
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your current situation&lt;/th&gt;
&lt;th&gt;Start by testing&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;You have a bounded idea but no project&lt;/td&gt;
&lt;td&gt;Replit, Lovable, Bolt, v0, Base44, or Google AI Studio&lt;/td&gt;
&lt;td&gt;The immediate question is whether you can obtain and test a complete running path with little setup.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The interface needs frequent visual refinement&lt;/td&gt;
&lt;td&gt;Lovable, v0, or Bolt&lt;/td&gt;
&lt;td&gt;Each offers a visual selection or design surface connected to the running project.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The app depends on integrated data, authentication, or hosting&lt;/td&gt;
&lt;td&gt;Base44, Replit, Lovable, or Bolt&lt;/td&gt;
&lt;td&gt;Integration may remove setup, but portability and public-access boundaries need explicit checks.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A repository already exists and the change is narrow&lt;/td&gt;
&lt;td&gt;Codex, Claude Code, Cursor, Windsurf, Copilot, or Antigravity&lt;/td&gt;
&lt;td&gt;The useful output is a scoped plan, reviewable change, checks, and a recovery path.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You prefer terminal work and can review commands&lt;/td&gt;
&lt;td&gt;Claude Code or Codex CLI&lt;/td&gt;
&lt;td&gt;The terminal can make project actions direct, but the operator owns the permission and command boundary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You need visual artifacts of plans and browser verification&lt;/td&gt;
&lt;td&gt;Antigravity, or another agent with equivalent recorded evidence&lt;/td&gt;
&lt;td&gt;Plans, screenshots, and recordings can make review easier when they correspond to the actual requirement.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I would not declare an overall winner from this table. The same product can be sensible in one row and needless complexity in another. For a first project, I would shortlist two products from the same row, confirm that the needed feature is included in the current plan, and build one complete user path in each before expanding the scope.&lt;/p&gt;

&lt;p&gt;If you want to practise that process before committing a real project, the &lt;a href="https://ailesson.io/courses/vibe-coding-for-beginners" rel="noopener noreferrer"&gt;AILesson Vibe Coding for Beginners Course&lt;/a&gt; follows one synthetic app from brief to Preview, focused repair, file inspection, bounded agent change, verification, and an honest non-public handoff. It stops where the evidence stops: the resulting demo is not described as production-ready, independently reproducible, or publicly deployed.&lt;/p&gt;

&lt;p&gt;Whichever tool you choose, keep the same acceptance rule. A polished screen is a candidate result. Trust grows only when the behavior, changes, checks, recovery path, and handoff state are visible enough for you—or the next person—to inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.replit.com/learn/build-with-agent" rel="noopener noreferrer"&gt;Replit Agent documentation&lt;/a&gt; — planning, testing, checkpoints, and the integrated workspace.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.lovable.dev/tips-tricks/deployment-hosting-ownership" rel="noopener noreferrer"&gt;Lovable deployment and ownership documentation&lt;/a&gt; — managed services, GitHub code ownership, hosting, and migration boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://support.bolt.new/building/intro-bolt" rel="noopener noreferrer"&gt;Bolt introduction&lt;/a&gt; — browser-based building, databases, authentication, and hosting.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://v0.app/docs/faqs" rel="noopener noreferrer"&gt;v0 FAQs&lt;/a&gt; — the 2026 editor, Git integration, projects, and Preview changes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.base44.com/documentation/building-your-app/developer-tools" rel="noopener noreferrer"&gt;Base44 developer tools&lt;/a&gt; — code access, backend services, integrations, GitHub, and local development.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ai.google.dev/gemini-api/docs/aistudio-build-mode" rel="noopener noreferrer"&gt;Google AI Studio Build documentation&lt;/a&gt; — current web and Android Build modes, export, and deployment paths.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developers.openai.com/codex/" rel="noopener noreferrer"&gt;Codex documentation&lt;/a&gt; — project understanding, changes, commands, checks, and review.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://code.claude.com/docs/en/how-claude-code-works" rel="noopener noreferrer"&gt;How Claude Code works&lt;/a&gt; — built-in tools, Plan mode, permissions, and checkpoints.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.cursor.com/chat/overview" rel="noopener noreferrer"&gt;Cursor Agent documentation&lt;/a&gt; — completion, Agent tools, project context, and review workflow.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://windsurf.com/switch/cursor" rel="noopener noreferrer"&gt;Windsurf 2.0&lt;/a&gt; and &lt;a href="https://docs.devin.ai/desktop/cascade/cascade" rel="noopener noreferrer"&gt;Cascade documentation&lt;/a&gt; — the current editor, agent orchestration, planning, tools, checkpoints, and diagnostics.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.github.com/en/copilot/how-tos/github-copilot-app/agent-sessions" rel="noopener noreferrer"&gt;GitHub Copilot app sessions&lt;/a&gt; — session modes, models, branches, and isolated workspaces.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://codelabs.developers.google.com/getting-started-google-antigravity" rel="noopener noreferrer"&gt;Google Antigravity Codelab&lt;/a&gt; — product surfaces, browser actions, schedules, and artifact-led work.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>codingagents</category>
    </item>
    <item>
      <title>Best Online Linux Terminals in 2026: Real Environments Compared</title>
      <dc:creator>Labby</dc:creator>
      <pubDate>Wed, 19 Aug 2026 06:30:58 +0000</pubDate>
      <link>https://dev.to/labex/best-online-linux-terminals-in-2026-real-environments-compared-14jp</link>
      <guid>https://dev.to/labex/best-online-linux-terminals-in-2026-real-environments-compared-14jp</guid>
      <description>&lt;p&gt;Running &lt;code&gt;ls&lt;/code&gt; in a browser does not prove that Linux is running behind the prompt.&lt;/p&gt;

&lt;p&gt;Some online terminals connect to an Ubuntu virtual machine. Some start a short-lived container. Others implement familiar commands in JavaScript without a Linux kernel, package database, service manager, or real process table. All three can draw a convincing prompt; only the first two execute commands on Linux.&lt;/p&gt;

&lt;p&gt;That difference determines what you can practise. A command simulator may be enough to learn what &lt;code&gt;cd&lt;/code&gt; does. Installing packages, managing users, inspecting processes, starting services, and diagnosing a changed system require a real Linux environment.&lt;/p&gt;

&lt;p&gt;For learning Linux rather than administering a particular cloud account, &lt;strong&gt;&lt;a href="https://labex.io/tutorials/linux-online-linux-terminal-and-playground-372915" rel="noopener noreferrer"&gt;LabEx Online Linux Terminal&lt;/a&gt; is the strongest option in this comparison&lt;/strong&gt;. It provides an Ubuntu VM with &lt;code&gt;sudo&lt;/code&gt;, several interfaces around the same system, guided labs, state checks, challenges, and contextual help. The terminal is also one entry point into a broader sandbox catalog and native LabEx apps for iPhone and Mac. Google Cloud Shell, AWS CloudShell, Azure Cloud Shell, GitHub Codespaces, and CoCalc are useful real environments built for different jobs. Coddy and WebTerm show why “runs in a browser” is not a sufficiently precise category.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is actually running behind the prompt?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Execution model&lt;/th&gt;
&lt;th&gt;What runs&lt;/th&gt;
&lt;th&gt;Practical consequence&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Command simulator&lt;/td&gt;
&lt;td&gt;Selected commands and a virtual file tree implemented in browser code&lt;/td&gt;
&lt;td&gt;Useful for syntax practice, but there is no Linux kernel or arbitrary system software&lt;/td&gt;
&lt;td&gt;WebTerm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stateless Linux runner&lt;/td&gt;
&lt;td&gt;A fresh server-side Linux container for each submission&lt;/td&gt;
&lt;td&gt;Real Bash output, but files and directory changes disappear between runs&lt;/td&gt;
&lt;td&gt;Coddy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stateful hosted Linux&lt;/td&gt;
&lt;td&gt;A remote Linux userspace retained for a session or project&lt;/td&gt;
&lt;td&gt;Real files, processes, and packages within the service's permissions&lt;/td&gt;
&lt;td&gt;AWS CloudShell, Azure Cloud Shell, CoCalc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual machine&lt;/td&gt;
&lt;td&gt;A complete Linux guest operating system provisioned on a server&lt;/td&gt;
&lt;td&gt;Suitable for users, permissions, packages, processes, services, and networking&lt;/td&gt;
&lt;td&gt;LabEx, Google Cloud Shell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dev container on a VM&lt;/td&gt;
&lt;td&gt;A project-specific container backed by a hosted VM&lt;/td&gt;
&lt;td&gt;A repeatable development workspace tied to repository files and tools&lt;/td&gt;
&lt;td&gt;GitHub Codespaces&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A real system gives diagnostic commands real state to inspect:&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;uname&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/os-release
&lt;span class="nb"&gt;id
&lt;/span&gt;ps aux
ip addr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simulator can return prepared text for some of these commands. It cannot expose an arbitrary package, daemon, kernel interface, or distribution-specific configuration that its developers did not implement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Online Linux terminal comparison
&lt;/h2&gt;

&lt;p&gt;The table focuses on the details that change what a learner can do. Startup speed is not scored because it varies with region, browser state, service capacity, and whether a remote environment is already warm. Product behaviour was checked against first-party documentation on August 19, 2026.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Backing environment&lt;/th&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Elevated access&lt;/th&gt;
&lt;th&gt;Learning support&lt;/th&gt;
&lt;th&gt;Best fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LabEx&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Ubuntu VM plus Linux and tool sandboxes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Retained within the active lab workflow&lt;/td&gt;
&lt;td&gt;Main Ubuntu VM: &lt;code&gt;sudo&lt;/code&gt; for &lt;code&gt;labex&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Guided labs, checks, challenges, and contextual help&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Learning Linux in a complete system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CoCalc&lt;/td&gt;
&lt;td&gt;Hosted Linux project&lt;/td&gt;
&lt;td&gt;Persistent project files and snapshots&lt;/td&gt;
&lt;td&gt;No root&lt;/td&gt;
&lt;td&gt;Course-oriented collaboration and shared terminals&lt;/td&gt;
&lt;td&gt;Collaborative classes and computational work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coddy&lt;/td&gt;
&lt;td&gt;Fresh Linux container per Run&lt;/td&gt;
&lt;td&gt;Stateless between submissions&lt;/td&gt;
&lt;td&gt;Not intended for system administration&lt;/td&gt;
&lt;td&gt;Command examples and related guides&lt;/td&gt;
&lt;td&gt;Testing one Bash block without an account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebTerm&lt;/td&gt;
&lt;td&gt;Browser command simulator&lt;/td&gt;
&lt;td&gt;Reset on page reload&lt;/td&gt;
&lt;td&gt;Simulated commands only&lt;/td&gt;
&lt;td&gt;Interactive command and Git tutorials&lt;/td&gt;
&lt;td&gt;Learning basic syntax without an account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud Shell&lt;/td&gt;
&lt;td&gt;Debian-based VM with containerised workspace&lt;/td&gt;
&lt;td&gt;5 GB persistent &lt;code&gt;$HOME&lt;/code&gt;; session VM is temporary&lt;/td&gt;
&lt;td&gt;Full root privileges and &lt;code&gt;sudo&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Product documentation&lt;/td&gt;
&lt;td&gt;Google Cloud operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS CloudShell&lt;/td&gt;
&lt;td&gt;Amazon Linux 2023 compute environment&lt;/td&gt;
&lt;td&gt;1 GB persistent &lt;code&gt;$HOME&lt;/code&gt; per Region in public environments&lt;/td&gt;
&lt;td&gt;Root inside the container and &lt;code&gt;sudo&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;AWS tutorials&lt;/td&gt;
&lt;td&gt;AWS operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure Cloud Shell&lt;/td&gt;
&lt;td&gt;Microsoft-managed Linux container&lt;/td&gt;
&lt;td&gt;Optional Azure Files mount; otherwise ephemeral&lt;/td&gt;
&lt;td&gt;No &lt;code&gt;sudo&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Azure training material&lt;/td&gt;
&lt;td&gt;Azure CLI or PowerShell operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Codespaces&lt;/td&gt;
&lt;td&gt;Dev container on a dedicated Linux VM&lt;/td&gt;
&lt;td&gt;Project workspace persists with the codespace&lt;/td&gt;
&lt;td&gt;Root inside the dev container&lt;/td&gt;
&lt;td&gt;Repository documentation and configuration&lt;/td&gt;
&lt;td&gt;Cloud software development&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why LabEx ranks first for learning Linux
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://labex.io/tutorials/linux-online-linux-terminal-and-playground-372915" rel="noopener noreferrer"&gt;LabEx Online Linux Terminal&lt;/a&gt; opens into an Ubuntu virtual machine rather than a fixed command simulator. The current &lt;a href="https://support.labex.io/en/using-labex/virtual-machine" rel="noopener noreferrer"&gt;VM documentation&lt;/a&gt; specifies Ubuntu 22.04, a &lt;code&gt;labex&lt;/code&gt; user with &lt;code&gt;sudo&lt;/code&gt; privileges, and three interfaces connected to the same environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Terminal&lt;/strong&gt; for direct command-line work;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebIDE&lt;/strong&gt; for editing files in a VS Code-like interface;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop&lt;/strong&gt; for graphical applications and visual file operations.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhcbe7d1v7vvzwkztf1j7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhcbe7d1v7vvzwkztf1j7.png" alt="The LabEx Linux environment with Desktop, WebIDE, Terminal, and Web 8080 tabs" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Terminal, WebIDE, Desktop, and web preview expose different views of the same Linux environment. Screenshot from the &lt;a href="https://labex.io/tutorials/linux-online-linux-terminal-and-playground-372915" rel="noopener noreferrer"&gt;Online Linux Terminal&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The shared VM matters more than the number of tabs. Create a file in the terminal and the WebIDE can edit that same file. Start a web service and the preview can open it. Change permissions and the next command sees the changed modes. The learner is operating one system whose state continues across actions.&lt;/p&gt;

&lt;p&gt;LabEx also gives that system a learning loop. &lt;a href="https://labex.io/labs/linux-your-first-linux-lab-270253?course=quick-start-with-linux" rel="noopener noreferrer"&gt;Your First Linux Lab&lt;/a&gt; introduces the environment through commands and step checks. In Guided Labs, verification tests whether the VM reached the required state. The &lt;a href="https://support.labex.io/en/using-labex/labby-ai" rel="noopener noreferrer"&gt;Labby documentation&lt;/a&gt; describes debugging and concept clarification inside the active lab workflow.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpqs90d1nhbnzyrq2an3j.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpqs90d1nhbnzyrq2an3j.gif" alt="LabEx switching from the Linux desktop to another environment interface" width="760" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The interface can change while the current lab environment remains in place.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That produces a concrete progression:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the task beside a prepared Linux system.&lt;/li&gt;
&lt;li&gt;Run commands and inspect their effects.&lt;/li&gt;
&lt;li&gt;Check whether the required state exists.&lt;/li&gt;
&lt;li&gt;Diagnose a failed check and retry.&lt;/li&gt;
&lt;li&gt;Move to a Challenge that states the objective with less procedural guidance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;a href="https://labex.io/learn/linux" rel="noopener noreferrer"&gt;Linux learning path&lt;/a&gt; continues from command-line basics into shell scripting, system administration, security, projects, and challenges. A blank cloud shell can run many of the same commands; it does not supply this sequence or check what the learner changed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Beyond one Ubuntu VM: LabEx Playgrounds
&lt;/h3&gt;

&lt;p&gt;The main Online Linux Terminal uses Ubuntu, but LabEx is not limited to one distribution or one terminal configuration. The &lt;a href="https://labex.io/playgrounds" rel="noopener noreferrer"&gt;LabEx Playgrounds catalog&lt;/a&gt; currently lists 52 browser-based sandbox environments.&lt;/p&gt;

&lt;p&gt;The Linux section includes Ubuntu, Ubuntu Desktop, Debian, Alpine, CentOS, RHEL, Fedora, Arch Linux, and openSUSE. Other categories provide prepared environments for tools and workloads such as Kali Linux, Docker, Kubernetes, Ansible, databases, programming languages, and AI coding agents. This lets a learner move from a general Linux terminal into an environment chosen for the next task without configuring it locally.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4sq1shryjsr73iaqqenb.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4sq1shryjsr73iaqqenb.jpg" alt="The LabEx Playgrounds catalog showing Ubuntu, Debian, Alpine, CentOS, RHEL, Fedora, Arch Linux, and openSUSE sandboxes" width="800" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Linux section of &lt;a href="https://labex.io/playgrounds" rel="noopener noreferrer"&gt;LabEx Playgrounds&lt;/a&gt; provides several distributions rather than a single Ubuntu entry point.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The useful distinction is between the environment and the lesson layered around it. A Playground supplies a prepared sandbox for open exploration. A Guided Lab adds instructions and checks. A Challenge states the objective with less procedural help. The learner can therefore choose both the Linux environment and the amount of guidance required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use the online Linux terminal in the iOS and macOS apps
&lt;/h3&gt;

&lt;p&gt;The browser is not the only client. LabEx also provides native apps for iPhone and Mac. The &lt;a href="https://support.labex.io/en/labex-app/virtual-machine-and-terminal" rel="noopener noreferrer"&gt;LabEx App VM documentation&lt;/a&gt; says the app attaches a remote VM to the current lab, while instructions, Labby, and checks remain in the learning interface.&lt;/p&gt;

&lt;p&gt;On iPhone, the VM opens in a sheet that can move between medium and large heights. The sheet shows setup progress and remaining session time, then provides terminal actions, interface switching, VM controls, and exposed ports. This makes it possible to start or resume terminal-based lab work from iOS without turning the phone into the machine running Linux.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F31r61yka03pjs0fzaqat.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F31r61yka03pjs0fzaqat.png" alt="The LabEx iPhone app showing a lab step while its remote VM prepares the terminal session" width="460" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The iPhone app keeps the lab instructions visible while the remote Linux environment starts.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On macOS, the terminal is embedded in a wider learning workspace. Terminals and exposed ports appear in the sidebar, while the current instructions, assistant, and verification result can remain visible beside the shell. The same split that matters in the browser remains intact: Linux runs in the remote environment; the app provides a native interface to operate it.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxfbnuq2gcpu79mf2bpiq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxfbnuq2gcpu79mf2bpiq.png" alt="The LabEx macOS app with an embedded Linux terminal, lab instructions, assistant, and verification panel" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The macOS app places the real terminal beside the current lab context and verification controls.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;LabEx adds more structure than a one-box runner, so it is not the quickest choice for checking whether one pipeline parses. It fits when the next question is “Did I change the Linux system correctly?” rather than only “Did this command produce output?”&lt;/p&gt;

&lt;h2&gt;
  
  
  How the other real Linux environments differ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CoCalc: persistent Linux projects and collaboration
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cocalc.io/features/terminal" rel="noopener noreferrer"&gt;CoCalc's online Linux terminal&lt;/a&gt; runs remotely and keeps project files with snapshots. Its distinguishing feature is real-time collaboration: several users can open a synchronized terminal and work beside a chat panel. That is useful for teaching a class or sharing computational work.&lt;/p&gt;

&lt;p&gt;CoCalc documents two boundaries that matter here. Users do not receive root access, and outbound internet access in a free project requires a license. It provides a real, persistent Linux project, but it is organised around collaboration and a broad scientific software stack rather than a checked Linux learning path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google and AWS Cloud Shell: real Linux for cloud operations
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/shell/docs/how-cloud-shell-works" rel="noopener noreferrer"&gt;Google Cloud Shell&lt;/a&gt; provisions a temporary Compute Engine VM running Debian-based Linux. The default workspace is a container on that VM. Users have &lt;code&gt;sudo&lt;/code&gt;, while a 5 GB persistent &lt;code&gt;$HOME&lt;/code&gt; survives after the session VM is discarded.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html" rel="noopener noreferrer"&gt;AWS CloudShell&lt;/a&gt; provides an Amazon Linux 2023 compute environment with AWS credentials from the current console session. AWS documents 1 vCPU, 2 GiB of RAM, &lt;code&gt;sudo&lt;/code&gt;, root access inside the container, and 1 GB of persistent home storage per Region for public environments.&lt;/p&gt;

&lt;p&gt;Both are capable Linux shells. Their pre-authenticated cloud context is an advantage when the task is &lt;code&gt;gcloud&lt;/code&gt; or AWS CLI work. For a Linux beginner, that same context introduces projects, IAM, Regions, quotas, and cloud-resource permissions that are unrelated to learning &lt;code&gt;chmod&lt;/code&gt;, package management, or service diagnosis.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Codespaces: a terminal inside a development workspace
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/codespaces/about-codespaces/deep-dive" rel="noopener noreferrer"&gt;GitHub Codespaces&lt;/a&gt; assigns a dedicated Linux VM, clones a repository into &lt;code&gt;/workspaces&lt;/code&gt;, and creates a Docker development container. It combines the terminal with browser-based VS Code, port forwarding, repository settings, and repeatable &lt;code&gt;devcontainer.json&lt;/code&gt; configuration. Root access is available inside the dev container.&lt;/p&gt;

&lt;p&gt;That makes Codespaces the better choice when the repository and editor are part of the task. It is a larger conceptual starting point for command-line practice: the user may encounter repository ownership, machine sizes, containers, ports, commits, and usage accounting before those concepts belong in the lesson.&lt;/p&gt;

&lt;h3&gt;
  
  
  Azure Cloud Shell: convenient, but deliberately restricted
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/cloud-shell/faq-troubleshooting" rel="noopener noreferrer"&gt;Azure Cloud Shell&lt;/a&gt; offers Bash or PowerShell with Azure tools already configured. Sessions time out after 20 minutes of inactivity. Persistent files require an Azure Files mount; without one, the session is ephemeral.&lt;/p&gt;

&lt;p&gt;Microsoft documents the user as unprivileged: &lt;code&gt;sudo&lt;/code&gt; and other elevated commands are unavailable. That boundary is reasonable for a managed Azure console, but it prevents system-administration exercises that install protected packages, create users, modify system configuration, or manage services as root.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where instant runners and simulators fit
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://coddy.tech/playground/terminal" rel="noopener noreferrer"&gt;Coddy&lt;/a&gt; executes real Bash and GNU tools in a server-side Linux container without requiring an account. Every Run starts in a fresh &lt;code&gt;/home&lt;/code&gt;, so a pipeline or multi-line script works, but a standalone &lt;code&gt;cd&lt;/code&gt;, created file, or environment variable cannot affect the next submission. It is useful when the whole task fits in one command block.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://webterm.app/en/free-play" rel="noopener noreferrer"&gt;WebTerm Free Play&lt;/a&gt; takes the browser-only approach. Its virtual file tree, pipes, redirection, Git workflows, and implemented commands support basic practice without registration. WebTerm also states that it is a simulator rather than a virtual machine. Reloading resets the environment, and there is no Linux backend on which to install an arbitrary package or inspect a real service.&lt;/p&gt;

&lt;p&gt;These tools are not defective versions of a VM. They solve smaller problems with less startup and account friction. The mistake is treating their terminal-shaped interfaces as evidence that they can reproduce system administration on Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose by the task behind the terminal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;LabEx&lt;/strong&gt; to learn Linux through real remote environments, checked tasks, and progressively reduced guidance, with additional Playgrounds and native iPhone and Mac access when the workflow needs them.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;CoCalc&lt;/strong&gt; when several people need a persistent shared terminal or a broad computational software stack.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Coddy&lt;/strong&gt; to test one self-contained Bash block without creating an account.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;WebTerm&lt;/strong&gt; for browser-only command syntax and Git tutorials, with the simulator boundary in mind.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Google Cloud Shell&lt;/strong&gt;, &lt;strong&gt;AWS CloudShell&lt;/strong&gt;, or &lt;strong&gt;Azure Cloud Shell&lt;/strong&gt; to operate resources in the matching cloud account.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;GitHub Codespaces&lt;/strong&gt; when a repository, editor, dev container, and terminal should form one development workspace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a first session on an actual Linux system, open &lt;a href="https://labex.io/labs/linux-your-first-linux-lab-270253?course=quick-start-with-linux" rel="noopener noreferrer"&gt;Your First Linux Lab&lt;/a&gt;. Run &lt;code&gt;whoami&lt;/code&gt;, &lt;code&gt;uname -a&lt;/code&gt;, &lt;code&gt;ps aux&lt;/code&gt;, and &lt;code&gt;cat /etc/os-release&lt;/code&gt;; then make a change and use the lab check to verify the resulting state.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://labex.io/tutorials/linux-online-linux-terminal-and-playground-372915" rel="noopener noreferrer"&gt;LabEx Online Linux Terminal&lt;/a&gt;, &lt;a href="https://support.labex.io/en/using-labex/virtual-machine" rel="noopener noreferrer"&gt;Virtual Machine documentation&lt;/a&gt;, and &lt;a href="https://support.labex.io/en/using-labex/labby-ai" rel="noopener noreferrer"&gt;Labby documentation&lt;/a&gt; — environment model, interfaces, privileges, checks, and contextual help.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://labex.io/playgrounds" rel="noopener noreferrer"&gt;LabEx Playgrounds&lt;/a&gt; — current Linux distributions and the broader catalog of sandbox environments.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://support.labex.io/en/labex-app/overview-and-get-started" rel="noopener noreferrer"&gt;LabEx App overview&lt;/a&gt; and &lt;a href="https://support.labex.io/en/labex-app/virtual-machine-and-terminal" rel="noopener noreferrer"&gt;VM and terminal documentation&lt;/a&gt; — supported Apple platforms, remote VM controls, terminals, forwarded ports, and learning layout.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cocalc.io/features/terminal" rel="noopener noreferrer"&gt;CoCalc Online Linux Terminal&lt;/a&gt; — remote Linux environment, collaboration, persistence, root, and network boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://coddy.tech/playground/terminal" rel="noopener noreferrer"&gt;Coddy Online Linux Terminal&lt;/a&gt; — server-side Linux execution and stateless runs.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://webterm.app/en/free-play" rel="noopener noreferrer"&gt;WebTerm Free Play&lt;/a&gt; — simulator model, implemented workflows, and reset behaviour.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cloud.google.com/shell/docs/how-cloud-shell-works" rel="noopener noreferrer"&gt;Google Cloud Shell architecture&lt;/a&gt; — VM, container, privileges, lifecycle, and persistent storage.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html" rel="noopener noreferrer"&gt;AWS CloudShell overview&lt;/a&gt;, &lt;a href="https://docs.aws.amazon.com/cloudshell/latest/userguide/vm-specs.html" rel="noopener noreferrer"&gt;environment specification&lt;/a&gt;, and &lt;a href="https://docs.aws.amazon.com/cloudshell/latest/userguide/cloudshell-security-faqs.html" rel="noopener noreferrer"&gt;security FAQ&lt;/a&gt; — Linux image, resources, storage, and root boundary.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/en-us/azure/cloud-shell/features" rel="noopener noreferrer"&gt;Azure Cloud Shell features&lt;/a&gt; and &lt;a href="https://learn.microsoft.com/en-us/azure/cloud-shell/faq-troubleshooting" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt; — persistence choices, timeout, and privilege restrictions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.github.com/en/codespaces/about-codespaces/deep-dive" rel="noopener noreferrer"&gt;GitHub Codespaces technical overview&lt;/a&gt; — VM and dev-container model, repository lifecycle, interfaces, and privileges.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>labex</category>
      <category>linux</category>
    </item>
    <item>
      <title>KodeKloud vs LabEx: Which Hands-On Learning Model Fits You?</title>
      <dc:creator>Labby</dc:creator>
      <pubDate>Thu, 13 Aug 2026 00:20:20 +0000</pubDate>
      <link>https://dev.to/labex/kodekloud-vs-labex-which-hands-on-learning-model-fits-you-28d3</link>
      <guid>https://dev.to/labex/kodekloud-vs-labex-which-hands-on-learning-model-fits-you-28d3</guid>
      <description>&lt;p&gt;Open a beginner Linux course on KodeKloud and you may meet an instructor, a fictional workplace, a quiz, and then a terminal lab.&lt;/p&gt;

&lt;p&gt;Open the comparable course on LabEx and the lesson begins beside the environment where you will run the commands.&lt;/p&gt;

&lt;p&gt;Both platforms lead to hands-on work. They differ in what they put before it, what happens when a check fails, how they remove guidance, and how completed practice becomes evidence of a skill.&lt;/p&gt;

&lt;p&gt;That makes “Does it have labs?” a poor way to compare KodeKloud and LabEx. Both do. A more useful question is which learning loop helps you move from following an explanation to solving a system problem without one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The useful comparison is not whether either platform has labs. It is what the platform can understand about your work when the expected result does not appear.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Short Version
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you want to...&lt;/th&gt;
&lt;th&gt;Start by looking at...&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Learn from instructor-led videos before practicing&lt;/td&gt;
&lt;td&gt;KodeKloud&lt;/td&gt;
&lt;td&gt;Its courses commonly combine narrated lessons, quizzes, stories, and browser labs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prepare for CKA, CKAD, CKS, or another named certification&lt;/td&gt;
&lt;td&gt;Either, with different formats&lt;/td&gt;
&lt;td&gt;KodeKloud emphasizes video-led courses and mock exams; LabEx organizes hands-on prep and practice exams inside certification Skill Trees.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learn mainly by reading and operating the environment&lt;/td&gt;
&lt;td&gt;LabEx&lt;/td&gt;
&lt;td&gt;Its default format is no-video, with instructions, a VM, and verification in the same workflow.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get feedback based on the current lab and your recent actions&lt;/td&gt;
&lt;td&gt;LabEx&lt;/td&gt;
&lt;td&gt;Labby works with the active lab context, while Deep Inspection can review operation logs after a failed verification.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Move from guided practice to minimally guided problems&lt;/td&gt;
&lt;td&gt;Either, with different structures&lt;/td&gt;
&lt;td&gt;KodeKloud offers Engineer tasks and challenge programs; LabEx places Guided Labs and Challenge Labs inside its course and Skill Tree model.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Track progress as evidence against individual technical skills&lt;/td&gt;
&lt;td&gt;LabEx&lt;/td&gt;
&lt;td&gt;Labs, challenges, projects, and assessments can contribute evidence to concept-level skills rather than only course completion.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keep labs, AI help, solutions, and projects in one lower-cost plan&lt;/td&gt;
&lt;td&gt;LabEx&lt;/td&gt;
&lt;td&gt;LabEx Pro lists these together at $99.90 per year; KodeKloud distributes advanced practice and AI across higher subscription tiers.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is not a ranking. A learner preparing for a certification may prefer KodeKloud's instructor-led sequence or LabEx's no-video, lab-first route. Someone who routinely skips course videos may reach the terminal faster with LabEx even when both catalogs cover the same command.&lt;/p&gt;




&lt;h2&gt;
  
  
  Before the Terminal: Two Ways to Introduce a Topic
&lt;/h2&gt;

&lt;h3&gt;
  
  
  KodeKloud: Explain, Then Practise
&lt;/h3&gt;

&lt;p&gt;KodeKloud's &lt;a href="https://kodekloud.com/courses/the-linux-basics-course" rel="noopener noreferrer"&gt;Linux Basics course&lt;/a&gt; shows its teaching pattern clearly. It mixes videos, a continuing story about a fictional company, multiple-choice questions, articles, and labs.&lt;/p&gt;

&lt;p&gt;A section on the shell includes video lessons before the corresponding terminal exercises. Later sections repeat the pattern for package management, the Linux kernel, networking, storage, and service management.&lt;/p&gt;

&lt;p&gt;The browser lab is not an optional appendix. KodeKloud says each lecture is followed by a hands-on lab where it validates the learner's work and provides feedback or hints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typical rhythm:&lt;/strong&gt; watch → answer → practise → receive feedback.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk7x0c9me8l4h0glczq55.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk7x0c9me8l4h0glczq55.jpg" alt="KodeKloud Linux course modules alongside course features such as video, story format, and labs" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;KodeKloud's public Linux course page presents modules beside video length, story format, and lab access.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  LabEx: Explain Inside the Practice
&lt;/h3&gt;

&lt;p&gt;LabEx starts from a different constraint. Its &lt;a href="https://support.labex.io/en/using-labex/welcome" rel="noopener noreferrer"&gt;support documentation&lt;/a&gt; describes the platform as no-video and organizes instruction around browser environments with automated checks. In &lt;a href="https://labex.io/courses/quick-start-with-linux" rel="noopener noreferrer"&gt;Quick Start with Linux&lt;/a&gt;, the course sequence contains five Guided Labs and five Challenges. The learner reads the explanation while working in the environment rather than watching a lecture before opening it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typical rhythm:&lt;/strong&gt; read → operate → check → retry.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1hnl14rdurd3lom7w2l.jpg" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1hnl14rdurd3lom7w2l.jpg" alt="The LabEx Quick Start with Linux syllabus mixing guided labs and challenge activities" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;LabEx's course syllabus places guided labs and challenge activities in one sequence; the two activity types use different icons.&lt;/em&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6sabhzexxbtlyt27l6mv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6sabhzexxbtlyt27l6mv.png" alt="A video lesson and a written guide both leading into terminal practice" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Different routes, same destination: the meaningful work still happens in a running environment.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Neither sequence is inherently more rigorous:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Video before the lab&lt;/strong&gt; can make architecture, process, and visual relationships easier to introduce.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text beside the terminal&lt;/strong&gt; makes it easier to pause on a command, inspect the current state, and retry without moving between a player and a lab.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The useful distinction is the amount and form of explanation you want before touching the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Passing Check Is Only the Beginning
&lt;/h2&gt;

&lt;p&gt;Both platforms remove much of the setup work that can consume a beginner's study session. In either one, a learner can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open a prepared environment in the browser;&lt;/li&gt;
&lt;li&gt;run commands and change configuration;&lt;/li&gt;
&lt;li&gt;submit the resulting state to automated checks;&lt;/li&gt;
&lt;li&gt;retry without first rebuilding a disposable Linux or Kubernetes machine locally.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both also check work rather than treating terminal activity as proof by itself. KodeKloud's Linux course describes labs that validate answers and return feedback. In LabEx, a Guided Lab runs a verification script against the VM after a step.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Running &lt;code&gt;chmod&lt;/code&gt; does not establish that the resulting permissions are correct. A useful lab checks the state that the command produced.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This shared mechanism matters more than catalog slogans. The learner has to connect a command, its effect, and the requirement the checker is enforcing. But a deterministic script usually answers only one question: does the current state satisfy the rule it was written to test?&lt;/p&gt;

&lt;h3&gt;
  
  
  LabEx Adds Context to a Failed Check
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://support.labex.io/en/using-labex/labby-ai" rel="noopener noreferrer"&gt;Labby&lt;/a&gt; is connected to the active lab workflow rather than operating as a detached chatbot. LabEx's documentation says that step verification runs inside the VM. The current &lt;a href="https://labex.io/tutorials/linux-your-first-linux-lab-270253" rel="noopener noreferrer"&gt;Your First Linux Lab&lt;/a&gt; goes further: its Ask feature understands the current lab context and recent actions, so a learner can ask where a mistake occurred, request a learning report based on the session, or ask how to improve.&lt;/p&gt;

&lt;p&gt;The same lab contains a deliberately failed verification after the learner runs &lt;code&gt;id -un&lt;/code&gt;. Clicking &lt;strong&gt;Re-Inspect&lt;/strong&gt; triggers &lt;strong&gt;Deep Inspection&lt;/strong&gt;, which uses AI to review the operation logs. It can then give feedback tied to what the learner actually did instead of repeating a generic hint for everyone who failed the same step.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Verification script — state inside the VM:&lt;/strong&gt; produces a deterministic pass or failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep Inspection — failed check and operation logs:&lt;/strong&gt; provides a contextual diagnosis and a more relevant next action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask Labby — question, current lab, and recent actions:&lt;/strong&gt; provides targeted explanation, debugging help, or session feedback.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjl7b8a19n6i2zsxghrr7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjl7b8a19n6i2zsxghrr7.png" alt="Labby answering a technical question inside the LabEx learning interface" width="800" height="1074"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Labby remains inside the learning workflow, with actions for asking questions, debugging, explaining code, and returning to the running lab. Image from the &lt;a href="https://support.labex.io/en/using-labex/labby-ai" rel="noopener noreferrer"&gt;LabEx AI Assistant documentation&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This does not make every diagnosis infallible. A verification script can be too narrow, and an AI inspection can misread an unusual sequence of actions. The advantage is the additional evidence available when a plain pass/fail result is not enough.&lt;/p&gt;

&lt;p&gt;The distinction appears again in how the environment is presented. KodeKloud offers course labs as well as open DevOps and cloud Playgrounds for experiments without predefined instructions. A &lt;a href="https://support.labex.io/en/using-labex/virtual-machine" rel="noopener noreferrer"&gt;LabEx VM&lt;/a&gt; can expose a Linux desktop, WebIDE, or terminal depending on the task. These are different interfaces around the same important idea: the learner should change a running environment, not only recall an answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens When the Instructions Stop?
&lt;/h2&gt;

&lt;p&gt;A guided lab can confirm that you followed a procedure. It cannot, by itself, show whether you would recognize when to use that procedure.&lt;/p&gt;

&lt;h3&gt;
  
  
  KodeKloud Engineer: The Task as a Work Ticket
&lt;/h3&gt;

&lt;p&gt;KodeKloud addresses that gap most visibly through &lt;a href="https://support.kodekloud.com/what-is-kodekloud-engineer" rel="noopener noreferrer"&gt;KodeKloud Engineer&lt;/a&gt;. The program places the learner in a fictional organization, provides project documentation and systems, and assigns operational tasks.&lt;/p&gt;

&lt;p&gt;The surrounding fiction gives each task the shape of a work ticket rather than another chapter in a course. KodeKloud's &lt;a href="https://kodekloud.com/blog/kodekloud-engineer-2-0/" rel="noopener noreferrer"&gt;Engineer 2.0 overview&lt;/a&gt; lists tasks in Linux, Git, Docker, Kubernetes, Jenkins, and Ansible.&lt;/p&gt;

&lt;h3&gt;
  
  
  LabEx Challenge: The Task as a Skill Check
&lt;/h3&gt;

&lt;p&gt;LabEx uses &lt;a href="https://support.labex.io/en/using-labex/quick-start" rel="noopener noreferrer"&gt;Challenge Labs&lt;/a&gt; for the same transition from instruction to application. A Challenge usually keeps the objectives and requirements but removes most explanatory steps. The learner must inspect the supplied state, decide which commands or files matter, make the change, and satisfy the checks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Independent-practice model&lt;/th&gt;
&lt;th&gt;KodeKloud Engineer&lt;/th&gt;
&lt;th&gt;LabEx Challenge&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;Fictional organization and operational task&lt;/td&gt;
&lt;td&gt;A stated objective in a prepared technical environment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connection to learning&lt;/td&gt;
&lt;td&gt;A distinct job-simulation experience&lt;/td&gt;
&lt;td&gt;Linked to courses and concept-level Skill Trees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Likely appeal&lt;/td&gt;
&lt;td&gt;Learners who value workplace narrative&lt;/td&gt;
&lt;td&gt;Learners who want a direct concept-to-check loop&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0h460xwg89m0yp32k1s2.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0h460xwg89m0yp32k1s2.png" alt="Guidance leading to terminal work and then to verified evidence" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The transition that matters: follow less, decide more, then verify the resulting state.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Neither should be described as employment or production experience. The systems are controlled learning environments. Their value is that they can expose a gap hidden by step-by-step completion: knowing a command is different from diagnosing when and how to use it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Certification Preparation Is No Longer a One-Sided Comparison
&lt;/h2&gt;

&lt;p&gt;Certification preparation is a traditional KodeKloud strength. Its &lt;a href="https://kodekloud.com/learning-path/cka" rel="noopener noreferrer"&gt;CKA Learning Path&lt;/a&gt;, for example, moves through Linux, containers, Kubernetes, a dedicated CKA course, and mock exams. The same catalog has named paths for &lt;a href="https://kodekloud.com/learning-path/ckad" rel="noopener noreferrer"&gt;CKAD&lt;/a&gt; and &lt;a href="https://kodekloud.com/learning-path/cks" rel="noopener noreferrer"&gt;CKS&lt;/a&gt;. This is a clear fit for learners who want an instructor-led course sequence ending in exam-shaped practice.&lt;/p&gt;

&lt;p&gt;LabEx now covers much of the same certification decision. Its public &lt;a href="https://labex.io/skilltrees" rel="noopener noreferrer"&gt;Skill Trees catalog&lt;/a&gt; lists CKA, CKAD, and CKS training alongside RHCSA, RHCE, LFCS, and CompTIA Linux+, A+, Network+, and Security+ preparation. For each of CKA, CKAD, and CKS, the catalog groups three courses: a preparation course and two practice-exam courses.&lt;/p&gt;

&lt;p&gt;The distinction is therefore less about whether certification content exists and more about how it is delivered:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Certification-prep question&lt;/th&gt;
&lt;th&gt;KodeKloud&lt;/th&gt;
&lt;th&gt;LabEx&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;How is the syllabus introduced?&lt;/td&gt;
&lt;td&gt;Instructor-led video courses followed by labs&lt;/td&gt;
&lt;td&gt;No-video explanations beside live environments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How does exam practice appear?&lt;/td&gt;
&lt;td&gt;Dedicated certification courses, readiness tests, and mock exams&lt;/td&gt;
&lt;td&gt;Hands-on prep courses and practice exams inside certification Skill Trees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What does progress connect to?&lt;/td&gt;
&lt;td&gt;A course and certification learning path&lt;/td&gt;
&lt;td&gt;A certification path plus reusable Kubernetes, Linux, and security skills&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Neither platform awards the CKA, CKAD, or CKS credential itself. Those credentials still come from the certification body after the learner passes its exam. The platforms provide preparation, labs, and practice exams; their course-completion certificates are a separate record.&lt;/p&gt;

&lt;h2&gt;
  
  
  Course Progress and Skill Evidence Are Not the Same Thing
&lt;/h2&gt;

&lt;p&gt;KodeKloud's &lt;a href="https://kodekloud.com/learning-paths/" rel="noopener noreferrer"&gt;Learning Paths&lt;/a&gt; answer a planning question: which courses should someone take for a domain, certification, or role? The current catalog includes domain paths for Linux, Kubernetes, cloud platforms, infrastructure as code, and AI, as well as role paths for system administrators, DevOps engineers, platform engineers, and other infrastructure roles. Course certificates, readiness tests, and KodeKloud Engineer progression provide several ways to represent work completed inside those paths.&lt;/p&gt;

&lt;p&gt;LabEx also has courses and certificates, but its &lt;a href="https://support.labex.io/en/using-labex/skill-trees" rel="noopener noreferrer"&gt;Skill Trees&lt;/a&gt; add a separate layer. A Skill Tree is a map of the capabilities inside a technical domain, not merely another order in which to consume lessons.&lt;/p&gt;

&lt;p&gt;The relationship is many-to-many: one lab can teach or assess several skills, while one skill can receive evidence from several Guided Labs, Challenge Labs, projects, or assessments. This matters for learners who do not follow one linear course from the beginning. Existing ability in file operations can remain distinct from gaps in Linux services, networking, or process management.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftnzdhoiq8k4rpl3tfaw3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftnzdhoiq8k4rpl3tfaw3.png" alt="A LabEx Skill Tree connecting a technical domain to skill groups, individual skills, and related labs" width="702" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Skill Tree structure connects a domain to reusable skills and then to the labs that practise them. Image from the &lt;a href="https://support.labex.io/en/using-labex/skill-trees" rel="noopener noreferrer"&gt;LabEx Skill Trees documentation&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/labex-labs/labex-skilltrees" rel="noopener noreferrer"&gt;public Skill Trees V2 catalog&lt;/a&gt; makes the structure inspectable outside the product UI. It defines domain boundaries, stable skill identifiers, names, descriptions, and canonical ordering. Each skill is intended to represent a reusable concept-level capability rather than one command option or one step in one lab.&lt;/p&gt;

&lt;p&gt;That distinction changes what a progress page can answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Course completion:&lt;/strong&gt; Did the learner reach the end of this sequence?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill evidence:&lt;/strong&gt; Which concepts did the completed work exercise across courses, challenges, projects, or assessments?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second view can reveal that finishing one course did not exercise every skill in the tree. It can also combine evidence from different courses when they exercise the same underlying capability.&lt;/p&gt;

&lt;p&gt;The careful word here is &lt;em&gt;evidence&lt;/em&gt;, not proof of job readiness. A completed LabEx challenge records performance inside that challenge's environment and checks. It does not establish how someone will perform in every unfamiliar system. The Skill Tree makes the platform's interpretation visible; it does not remove the limits of platform-based assessment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Price Changes the Practical Comparison
&lt;/h2&gt;

&lt;p&gt;Price is volatile, but omitting it would hide one of LabEx's clearest advantages. As of August 12, 2026, &lt;a href="https://labex.io/pricing" rel="noopener noreferrer"&gt;LabEx Pro&lt;/a&gt; is listed at &lt;strong&gt;$99.90 per year&lt;/strong&gt;. That plan includes 6,000+ hands-on labs, unlimited virtual machines, 2,000+ challenge solutions, 400+ projects, completion certificates, and full access to Labby.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kodekloud.com/pricing/" rel="noopener noreferrer"&gt;KodeKloud's pricing&lt;/a&gt; is regional and promotion-dependent, so its checkout price should be checked directly. Its feature split is still useful to compare: Standard includes the main course library and 1,280 hands-on labs; Pro adds playgrounds, cloud labs, projects, and unlimited KodeKloud Engineer work; the AI tier adds the personalized tutor and AI-assisted labs.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you need&lt;/th&gt;
&lt;th&gt;LabEx&lt;/th&gt;
&lt;th&gt;KodeKloud&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free hands-on access&lt;/td&gt;
&lt;td&gt;3 VMs per day&lt;/td&gt;
&lt;td&gt;Limited free courses and features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unlimited core labs&lt;/td&gt;
&lt;td&gt;Included in Pro&lt;/td&gt;
&lt;td&gt;Included in Standard and above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI assistance in the learning workflow&lt;/td&gt;
&lt;td&gt;Full Labby access in Pro&lt;/td&gt;
&lt;td&gt;Personalized tutor and AI-assisted labs in the AI tier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Challenges, solutions, and projects&lt;/td&gt;
&lt;td&gt;Included in Pro&lt;/td&gt;
&lt;td&gt;Access and task limits vary across Standard, Pro, and AI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The value advantage is not just a lower headline price. A learner who wants labs, project and challenge practice, solutions, and contextual AI help can obtain that bundle in one LabEx Pro subscription. The products are not feature-for-feature identical—KodeKloud also funds a large instructor-led video catalog—so the fair conclusion is narrower: &lt;strong&gt;for learners primarily buying hands-on practice and AI-assisted feedback, LabEx offers the stronger all-in price.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Which Platform Fits Your Learning Loop?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Start With KodeKloud If...
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want an instructor-led DevOps or cloud curriculum.&lt;/li&gt;
&lt;li&gt;You want instructor-led certification preparation with a long-established video and mock-exam sequence.&lt;/li&gt;
&lt;li&gt;A role-based sequence helps you decide what to learn next.&lt;/li&gt;
&lt;li&gt;Workplace narrative makes independent tasks more engaging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its videos and labs are designed to support each other, and KodeKloud Engineer provides a distinct place to practise ticket-shaped tasks after learning the foundations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start With LabEx If...
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Video is the part of online learning you usually skip.&lt;/li&gt;
&lt;li&gt;You prefer reading instructions beside a live environment.&lt;/li&gt;
&lt;li&gt;You want AI help that can use the current lab, recent actions, and failed verification context.&lt;/li&gt;
&lt;li&gt;You want a direct progression from Guided Labs to Challenges.&lt;/li&gt;
&lt;li&gt;You want progress represented as concept-level skill evidence across courses.&lt;/li&gt;
&lt;li&gt;You want hands-on certification paths and AI-assisted practice in one lower-cost annual plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The default interaction is reading, operating a VM, checking the result, and moving from guidance to a less-prescriptive problem.&lt;/p&gt;

&lt;p&gt;Topic coverage can change the answer. KodeKloud's public catalog is strongly developed around DevOps, Kubernetes, cloud, platform engineering, certification preparation, and newer AI topics. LabEx exposes learning directions beyond infrastructure, including programming languages, databases, data science, web development, and cybersecurity. A larger category list does not establish depth, so compare the actual course and challenge sequence for the subject you intend to study.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Compare the actual course and challenge sequence, then compare the plan that unlocks the features you will use.&lt;/strong&gt; A low entry price is less informative than the total cost of labs, AI help, solutions, and independent practice.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A 30-Minute Test Before You Choose
&lt;/h2&gt;

&lt;p&gt;Use the same small Linux topic on both platforms. File permissions, process inspection, or package management works better than comparing two unrelated flagship courses.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Measure time to terminal.&lt;/strong&gt; Start a free beginner lab and note how long it takes before you run the first meaningful command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make a reversible mistake.&lt;/strong&gt; Check whether the feedback merely states the expected answer or can explain the failure using what you actually did. In LabEx, compare the initial check with Re-Inspect and an Ask Labby question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove the procedure.&lt;/strong&gt; Complete one guided task, then find a Challenge or Engineer task covering related skills.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspect the evidence.&lt;/strong&gt; Can you tell what capability was exercised and what remains, or only that the activity is finished?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose for your real habits.&lt;/strong&gt; Prefer the balance of explanation, terminal time, feedback, and independent work that matches how you actually study.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The better platform is the one that gets you from a correct walkthrough to an unfamiliar system state with enough support to recover, but not so much that the decisions have already been made for you.&lt;/p&gt;

</description>
      <category>labex</category>
      <category>article</category>
    </item>
    <item>
      <title>Display User and Group Information Challenge Solution</title>
      <dc:creator>Labby</dc:creator>
      <pubDate>Thu, 09 Jul 2026 00:56:34 +0000</pubDate>
      <link>https://dev.to/labex/display-user-and-group-information-challenge-solution-3kcf</link>
      <guid>https://dev.to/labex/display-user-and-group-information-challenge-solution-3kcf</guid>
      <description>&lt;p&gt;The LabEx challenge &lt;a href="https://labex.io/labs/linux-display-user-and-group-information-8718" rel="noopener noreferrer"&gt;Display User and Group Information&lt;/a&gt; is short, but it tests an important Linux reflex: before reasoning about permissions, confirm which user the shell is running as and which groups that user belongs to.&lt;/p&gt;

&lt;p&gt;Unlike a guided lab, this is a challenge. The page gives the required outcome, but it expects you to choose the commands yourself. The solution comes from matching each requirement to the Linux command that reports exactly that information.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Summary
&lt;/h2&gt;

&lt;p&gt;The challenge has two tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Display the current user identity.&lt;/li&gt;
&lt;li&gt;Display detailed user and group information, including &lt;code&gt;uid&lt;/code&gt;, &lt;code&gt;gid&lt;/code&gt;, and &lt;code&gt;groups&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means the answer needs two levels of identity information. The first task only wants the username. The second task wants the numeric and named identity fields Linux uses for access decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Print the Current Username
&lt;/h2&gt;

&lt;p&gt;For the first task, use &lt;code&gt;whoami&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;whoami&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The expected output is only the current username. In the LabEx environment, it may look like this:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This command answers a narrow question: "Which user am I right now?" It does not show groups, IDs, or permission details. That is why it is the right command for the first requirement, but not enough for the second one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Print User and Group Details
&lt;/h2&gt;

&lt;p&gt;For the second task, use &lt;code&gt;id&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;id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output should include the user ID, primary group ID, and supplementary groups:&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="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000&lt;span class="o"&gt;(&lt;/span&gt;labex&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000&lt;span class="o"&gt;(&lt;/span&gt;labex&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000&lt;span class="o"&gt;(&lt;/span&gt;labex&lt;span class="o"&gt;)&lt;/span&gt;,4&lt;span class="o"&gt;(&lt;/span&gt;adm&lt;span class="o"&gt;)&lt;/span&gt;,24&lt;span class="o"&gt;(&lt;/span&gt;cdrom&lt;span class="o"&gt;)&lt;/span&gt;,27&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt;&lt;span class="o"&gt;)&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbbwso2ureld66ocreg62.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbbwso2ureld66ocreg62.png" alt="Terminal showing the whoami and id commands for the challenge solution" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The exact numbers and group names can differ between environments. What matters is the structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;uid=1000(labex)&lt;/code&gt; means the current user has numeric user ID &lt;code&gt;1000&lt;/code&gt; and username &lt;code&gt;labex&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gid=1000(labex)&lt;/code&gt; means the primary group ID is &lt;code&gt;1000&lt;/code&gt; and the group name is &lt;code&gt;labex&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;groups=...&lt;/code&gt; lists every group membership available to the current user.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why These Commands Solve the Challenge
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;whoami&lt;/code&gt; solves the first requirement because it prints only the current username. If the challenge asks for a single user identity, this is the cleanest output.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;id&lt;/code&gt; solves the second requirement because it includes the fields named in the prompt: &lt;code&gt;uid&lt;/code&gt;, &lt;code&gt;gid&lt;/code&gt;, and &lt;code&gt;groups&lt;/code&gt;. You do not need to inspect &lt;code&gt;/etc/passwd&lt;/code&gt; or &lt;code&gt;/etc/group&lt;/code&gt; for this challenge. Those files can explain account configuration, but the task asks for the identity information of the current session, and &lt;code&gt;id&lt;/code&gt; reports that directly.&lt;/p&gt;

&lt;p&gt;The common mistake is to stop after &lt;code&gt;whoami&lt;/code&gt;. That confirms the username, but it does not prove group membership. In Linux permission checks, group membership can be the difference between access granted and access denied.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Answer
&lt;/h2&gt;

&lt;p&gt;Run these two commands:&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;whoami
id&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You have completed the challenge when the first command prints the current username and the second command prints identity details containing &lt;code&gt;uid&lt;/code&gt;, &lt;code&gt;gid&lt;/code&gt;, and &lt;code&gt;groups&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>labex</category>
      <category>linux</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>Learn Linux Through Operational Challenges</title>
      <dc:creator>Labby</dc:creator>
      <pubDate>Wed, 08 Jul 2026 04:15:53 +0000</pubDate>
      <link>https://dev.to/labex/learn-linux-through-operational-challenges-3cij</link>
      <guid>https://dev.to/labex/learn-linux-through-operational-challenges-3cij</guid>
      <description>&lt;p&gt;Many Linux beginners can remember a command before they know where it belongs. They can run &lt;code&gt;touch&lt;/code&gt;, &lt;code&gt;chmod&lt;/code&gt;, &lt;code&gt;ss&lt;/code&gt;, or &lt;code&gt;systemctl&lt;/code&gt;, but still hesitate when a task has a working directory, an existing file, a service that must stay running, and a specific result to verify.&lt;/p&gt;

&lt;p&gt;That gap is where command practice starts to become operational practice.&lt;/p&gt;

&lt;p&gt;The contrast is simple: a command list teaches syntax, while an operational challenge forces the command to answer a real constraint.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Febuydybhdf71ency69bd.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Febuydybhdf71ency69bd.png" alt="Comparison of command lists and operational Linux practice" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/courses/100-days-of-linux-challenges" rel="noopener noreferrer"&gt;100 Days of Linux&lt;/a&gt; is built around that gap. The course is not a list of 100 unrelated commands. It is a sequence of 100 small Linux challenges, each framed as a task with context, scope, a required final state, and acceptance criteria.&lt;/p&gt;

&lt;p&gt;The first challenge is intentionally small. In "Claim the Drop Folder", the learner starts in &lt;code&gt;/home/labex/project&lt;/code&gt;, finds an existing &lt;code&gt;drop-folder/incoming&lt;/code&gt; directory, and creates a &lt;code&gt;ready.flag&lt;/code&gt; file in that exact location. The command may be as simple as &lt;code&gt;touch&lt;/code&gt;, but the real lesson is not the command name. The learner has to confirm the working directory, avoid creating the marker in the wrong place, and leave the existing folder structure intact.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft8u5mcob78kurg5i7s5k.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft8u5mcob78kurg5i7s5k.png" alt="Terminal scene showing a ready flag created in the correct drop folder" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That pattern repeats across the course: a command is useful only when it changes the right thing and leaves the rest of the system alone.&lt;/p&gt;

&lt;p&gt;The syllabus makes the progression visible. The first ten days focus on handoffs: claiming a folder, inventorying a delivery, reading a welcome note, preparing a review folder, and closing the first handoff. The next sections move through reading operational evidence, safe file changes, access boundaries, running work reliably, local app validation, tooling, managed services, recovery, and final operations simulations.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnmjcznrmb5zifhjatlw4.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnmjcznrmb5zifhjatlw4.png" alt="Timeline showing the 100 Days of Linux practice sequence" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That structure gives the command a job. A checklist can tell a learner that &lt;code&gt;chmod 600 file&lt;/code&gt; restricts a file to its owner. A challenge can make that command matter by placing it inside a specific handoff: a private manager note already has the correct content, but its mode is too open. The task is to change the permission while preserving the file and its contents.&lt;/p&gt;

&lt;p&gt;The same approach works for networking and services. In one local app validation challenge, the learner must identify which candidate TCP port is actually listening by inspecting local sockets with a command such as &lt;code&gt;ss -ltn&lt;/code&gt;, then copy only the matching port card into a review folder. The service must remain running. The final state matters as much as the inspection command.&lt;/p&gt;

&lt;p&gt;Later tasks add more moving parts without turning into vague troubleshooting exercises. A maintenance challenge asks the learner to schedule a prepared heartbeat script with cron and confirm that the expected output file appears. A recovery challenge asks them to inspect mounts under &lt;code&gt;/mnt&lt;/code&gt;, locate a staged recovery card, copy it into the project intake folder, and leave the mount available.&lt;/p&gt;

&lt;p&gt;By the final day, the task has become a compact incident. The learner must close a broken local status API by reading service evidence, fixing config access for the &lt;code&gt;labex&lt;/code&gt; service user, clearing stale process state, starting &lt;code&gt;labex-status-api.service&lt;/code&gt;, and verifying that &lt;code&gt;http://127.0.0.1:18200/health&lt;/code&gt; returns the expected status lines. That is still beginner-scoped, but it is no longer isolated command recall.&lt;/p&gt;

&lt;p&gt;Across these examples, the same small loop keeps coming back.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcs2wlrbrsn793f32s6i5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcs2wlrbrsn793f32s6i5.png" alt="Flow diagram showing command practice moving through scope, evidence, and verification" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The useful habit running through the course is constraint-aware work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Know the current workspace before changing files.&lt;/li&gt;
&lt;li&gt;Read the existing structure instead of recreating it.&lt;/li&gt;
&lt;li&gt;Preserve content when the task is only about permissions or placement.&lt;/li&gt;
&lt;li&gt;Inspect evidence before acting on a service or port.&lt;/li&gt;
&lt;li&gt;Verify the final state with the same precision as the task description.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those habits are hard to build from reference material alone. They come from repeated small tasks where a wrong directory, an extra copy, a deleted file, or an unverified service changes the outcome.&lt;/p&gt;

&lt;p&gt;For someone who has already learned basic commands but still feels slow in a Linux terminal, the first useful step is not another command list. Start with the early handoff challenges in &lt;a href="https://labex.io/courses/100-days-of-linux-challenges" rel="noopener noreferrer"&gt;100 Days of Linux&lt;/a&gt;, then move into the permissions, service, and recovery sections once the basic file tasks feel routine.&lt;/p&gt;

</description>
      <category>labex</category>
      <category>linux</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>Linux Journey Is Now Part of LabEx</title>
      <dc:creator>Labby</dc:creator>
      <pubDate>Mon, 08 Jun 2026 01:38:17 +0000</pubDate>
      <link>https://dev.to/labex/linux-journey-is-now-part-of-labex-33bc</link>
      <guid>https://dev.to/labex/linux-journey-is-now-part-of-labex-33bc</guid>
      <description>&lt;p&gt;Linux Journey has been one of the most popular free resources for learning Linux since 2015.&lt;/p&gt;

&lt;p&gt;Created by Cindy Quach, the project has helped millions of beginners take their first steps into Linux through simple lessons and quizzes.&lt;/p&gt;

&lt;p&gt;Today, Linux Journey is officially part of LabEx.&lt;/p&gt;

&lt;p&gt;The original Linux Journey website (&lt;a href="https://linuxjourney.com" rel="noopener noreferrer"&gt;https://linuxjourney.com&lt;/a&gt;) now redirects to &lt;a href="https://labex.io/linuxjourney" rel="noopener noreferrer"&gt;https://labex.io/linuxjourney&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Our goal is straightforward: keep Linux Journey free, open source, and actively maintained for the next generation of Linux learners.&lt;/p&gt;

&lt;p&gt;We'll continue maintaining existing lessons, fixing issues, improving translations, and adding new beginner-friendly content over time.&lt;/p&gt;

&lt;p&gt;The official repository is now maintained by the LabEx team:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/labex-labs/linuxjourney" rel="noopener noreferrer"&gt;https://github.com/labex-labs/linuxjourney&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've also recently launched the Linux Journey iOS app, making it easier to learn Linux on the go:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/app/linux-journey/id6770861660" rel="noopener noreferrer"&gt;https://apps.apple.com/app/linux-journey/id6770861660&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most importantly, nothing changes about what made Linux Journey special.&lt;/p&gt;

&lt;p&gt;It remains free. It remains open source. It remains community-driven.&lt;/p&gt;

&lt;p&gt;A huge thank you to Cindy Quach and all contributors who helped build Linux Journey into one of the most loved Linux learning resources on the internet.&lt;/p&gt;

&lt;p&gt;We're honored to continue the journey.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>labex</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Master Git: How to Undo Commits, Switch Branches, and Manage Tags Effectively</title>
      <dc:creator>Labby</dc:creator>
      <pubDate>Sun, 07 Jun 2026 17:27:55 +0000</pubDate>
      <link>https://dev.to/labex/master-git-how-to-undo-commits-switch-branches-and-manage-tags-effectively-1pb0</link>
      <guid>https://dev.to/labex/master-git-how-to-undo-commits-switch-branches-and-manage-tags-effectively-1pb0</guid>
      <description>&lt;p&gt;Every developer has been there: a messy commit history, confusion over branch switching, or the need to mark a release milestone. Git is the backbone of modern software development, but mastering it requires more than just memorizing commands. This learning path takes you through three practical scenarios that turn Git from a daunting tool into your most reliable project assistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Undo and Remove a Specific Git Commit from Current Branch
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog-image.labex.io%2Flabs%2Fgit-how-to-undo-and-remove-a-specific-git-commit-from-current-branch-392832" 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%2Fog-image.labex.io%2Flabs%2Fgit-how-to-undo-and-remove-a-specific-git-commit-from-current-branch-392832" alt="How to Undo and Remove a Specific Git Commit from Current Branch" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Beginner | &lt;strong&gt;Time:&lt;/strong&gt; 15 minutes&lt;/p&gt;

&lt;p&gt;Learn how to undo and remove a specific Git commit from the current branch. Discover the best practices for managing Git commit history and restoring removed commits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/labs/git-how-to-undo-and-remove-a-specific-git-commit-from-current-branch-392832" rel="noopener noreferrer"&gt;Practice on LabEx →&lt;/a&gt; | &lt;a href="https://labex.io/tutorials/git-how-to-undo-and-remove-a-specific-git-commit-from-current-branch-392832" rel="noopener noreferrer"&gt;Tutorial →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Git Switch vs Git Checkout
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog-image.labex.io%2Flabs%2Fgit-git-switch-vs-git-checkout-391555" 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%2Fog-image.labex.io%2Flabs%2Fgit-git-switch-vs-git-checkout-391555" alt="Git Switch vs Git Checkout" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Beginner | &lt;strong&gt;Time:&lt;/strong&gt; 30 minutes&lt;/p&gt;

&lt;p&gt;Explore the differences between Git switch and Git checkout commands, learn when to use each, and master your Git workflow. Practical examples and use cases included.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/labs/git-git-switch-vs-git-checkout-391555" rel="noopener noreferrer"&gt;Practice on LabEx →&lt;/a&gt; | &lt;a href="https://labex.io/tutorials/git-git-switch-vs-git-checkout-391555" rel="noopener noreferrer"&gt;Tutorial →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tagging Your Project's History
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog-image.labex.io%2Flabs%2Fgit-tagging-your-project-s-history-387763" 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%2Fog-image.labex.io%2Flabs%2Fgit-tagging-your-project-s-history-387763" alt="Tagging Your Project's History" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Beginner | &lt;strong&gt;Time:&lt;/strong&gt; 5 minutes&lt;/p&gt;

&lt;p&gt;Learn how to use Git tags to mark important milestones in your project's history. Practice creating lightweight and annotated tags, and listing tags in a repository using a time machine software project scenario.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/labs/git-tagging-your-project-s-history-387763" rel="noopener noreferrer"&gt;Practice on LabEx →&lt;/a&gt; | &lt;a href="https://labex.io/tutorials/git-tagging-your-project-s-history-387763" rel="noopener noreferrer"&gt;Tutorial →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Git mastery isn't about memorizing every flag in the manual; it is about understanding how to manage your project's evolution. By completing these three labs, you move from simply 'using' Git to 'commanding' it. Ready to level up your version control skills? Dive into these interactive exercises today and start building a cleaner, more professional development history.&lt;/p&gt;

</description>
      <category>git</category>
      <category>versioncontrol</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>4 Wireshark Labs: Master Network Analysis, Nmap Scanning, and Metasploit Exploitation</title>
      <dc:creator>Labby</dc:creator>
      <pubDate>Sat, 06 Jun 2026 17:24:35 +0000</pubDate>
      <link>https://dev.to/labex/4-wireshark-labs-master-network-analysis-nmap-scanning-and-metasploit-exploitation-3gip</link>
      <guid>https://dev.to/labex/4-wireshark-labs-master-network-analysis-nmap-scanning-and-metasploit-exploitation-3gip</guid>
      <description>&lt;p&gt;Ready to see what is really happening on your network? Wireshark is the gold standard for packet analysis, and we have built the perfect roadmap to take you from zero to hero. Forget boring videos—our hands-on labs put you in the driver's seat of a real network environment. Let's dive into the packets!&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Nmap and Metasploit for Network Scanning and Vulnerability Analysis
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog-image.labex.io%2Flabs%2Fnmap-use-nmap-and-metasploit-for-network-scanning-and-vulnerability-analysis-416120" 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%2Fog-image.labex.io%2Flabs%2Fnmap-use-nmap-and-metasploit-for-network-scanning-and-vulnerability-analysis-416120" alt="Use Nmap and Metasploit for Network Scanning and Vulnerability Analysis" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Beginner | &lt;strong&gt;Time:&lt;/strong&gt; 25 minutes&lt;/p&gt;

&lt;p&gt;In this lab, you will learn how to use Nmap for network scanning and Metasploit for vulnerability analysis. You'll cover basic and advanced Nmap techniques, import scan results into Metasploit, and utilize Metasploit modules to identify and exploit vulnerabilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/labs/nmap-use-nmap-and-metasploit-for-network-scanning-and-vulnerability-analysis-416120" rel="noopener noreferrer"&gt;Practice on LabEx →&lt;/a&gt; | &lt;a href="https://labex.io/tutorials/nmap-use-nmap-and-metasploit-for-network-scanning-and-vulnerability-analysis-416120" rel="noopener noreferrer"&gt;Tutorial →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploit Unreal IRCd Vulnerability with Nmap and Metasploit
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog-image.labex.io%2Flabs%2Fnmap-exploit-unreal-ircd-vulnerability-with-nmap-and-metasploit-416126" 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%2Fog-image.labex.io%2Flabs%2Fnmap-exploit-unreal-ircd-vulnerability-with-nmap-and-metasploit-416126" alt="Exploit Unreal IRCd Vulnerability with Nmap and Metasploit" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Beginner | &lt;strong&gt;Time:&lt;/strong&gt; 20 minutes&lt;/p&gt;

&lt;p&gt;In this lab, you will learn how to exploit the Unreal IRCd vulnerability using Nmap for vulnerability scanning and Metasploit for exploitation. You'll understand the vulnerability, scan for it, exploit it, and validate the successful exploitation. This hands-on lab provides practical experience in network security.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/labs/nmap-exploit-unreal-ircd-vulnerability-with-nmap-and-metasploit-416126" rel="noopener noreferrer"&gt;Practice on LabEx →&lt;/a&gt; | &lt;a href="https://labex.io/tutorials/nmap-exploit-unreal-ircd-vulnerability-with-nmap-and-metasploit-416126" rel="noopener noreferrer"&gt;Tutorial →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Network Analysis with Wireshark
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog-image.labex.io%2Flabs%2Fwireshark-network-analysis-with-wireshark-415958" 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%2Fog-image.labex.io%2Flabs%2Fwireshark-network-analysis-with-wireshark-415958" alt="Network Analysis with Wireshark" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Beginner | &lt;strong&gt;Time:&lt;/strong&gt; 28 minutes&lt;/p&gt;

&lt;p&gt;In this lab, you will learn how to perform network analysis using Wireshark. You'll install Wireshark, capture network traffic, analyze packet data, and use filters to identify and investigate network issues. This hands-on experience will enhance your cybersecurity skills.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/labs/wireshark-network-analysis-with-wireshark-415958" rel="noopener noreferrer"&gt;Practice on LabEx →&lt;/a&gt; | &lt;a href="https://labex.io/tutorials/wireshark-network-analysis-with-wireshark-415958" rel="noopener noreferrer"&gt;Tutorial →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore and Customize Wireshark Interface
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog-image.labex.io%2Flabs%2Fwireshark-explore-and-customize-wireshark-interface-415949" 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%2Fog-image.labex.io%2Flabs%2Fwireshark-explore-and-customize-wireshark-interface-415949" alt="Explore and Customize Wireshark Interface" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Beginner | &lt;strong&gt;Time:&lt;/strong&gt; 15 minutes&lt;/p&gt;

&lt;p&gt;In this lab, you will launch Wireshark and explore its interface. You'll learn how to navigate the various panels and customize the layout to suit your needs. This includes adjusting columns, filters, and display options for efficient network analysis.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/labs/wireshark-explore-and-customize-wireshark-interface-415949" rel="noopener noreferrer"&gt;Practice on LabEx →&lt;/a&gt; | &lt;a href="https://labex.io/tutorials/wireshark-explore-and-customize-wireshark-interface-415949" rel="noopener noreferrer"&gt;Tutorial →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Network analysis is a superpower in the cybersecurity world, and these labs are your fast track to gaining it. Whether you are troubleshooting a connection or hunting for intruders, these practical skills will serve you for years to come. Don't just read about it—jump into the playground and start capturing packets today!&lt;/p&gt;

</description>
      <category>wireshark</category>
      <category>cybersecurity</category>
      <category>networking</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Master Java Core: 5 Hands-On Labs for OOP, Threading, and Encryption</title>
      <dc:creator>Labby</dc:creator>
      <pubDate>Fri, 05 Jun 2026 17:34:34 +0000</pubDate>
      <link>https://dev.to/labex/master-java-core-5-hands-on-labs-for-oop-threading-and-encryption-44p8</link>
      <guid>https://dev.to/labex/master-java-core-5-hands-on-labs-for-oop-threading-and-encryption-44p8</guid>
      <description>&lt;p&gt;Embarking on your Java journey can feel like staring at a mountain of syntax and abstract concepts. But what if you could master the language by building, breaking, and fixing real code? This curated learning path takes you from the basics of object-oriented design to the thrill of implementing your own encryption algorithms, all within an interactive environment designed for rapid skill acquisition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arranging Classes by Functionality
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog-image.labex.io%2Flabs%2Fjava-arranging-classes-by-functionality-178550" 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%2Fog-image.labex.io%2Flabs%2Fjava-arranging-classes-by-functionality-178550" alt="Arranging Classes by Functionality" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Beginner | &lt;strong&gt;Time:&lt;/strong&gt; 5 minutes&lt;/p&gt;

&lt;p&gt;In this lab, you will learn to use packages to arrange for classes according to their functionalities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/labs/java-arranging-classes-by-functionality-178550" rel="noopener noreferrer"&gt;Practice on LabEx →&lt;/a&gt; | &lt;a href="https://labex.io/tutorials/java-arranging-classes-by-functionality-178550" rel="noopener noreferrer"&gt;Tutorial →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Overloading and Overriding
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog-image.labex.io%2Flabs%2Fjava-overloading-and-overriding-178549" 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%2Fog-image.labex.io%2Flabs%2Fjava-overloading-and-overriding-178549" alt="Overloading and Overriding" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Beginner | &lt;strong&gt;Time:&lt;/strong&gt; 10 minutes&lt;/p&gt;

&lt;p&gt;In this lab, you will learn method overloading and method overriding. Overriding and overloading are two concepts used in Java programming language. Both the concepts allow programmer to provide different implementations for methods under the same name. Overloading happens at compile-time while overriding happens at runtime. Static methods can be overloaded but cannot be overridden. Overloading is a static bond while overriding is dynamic bond.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/labs/java-overloading-and-overriding-178549" rel="noopener noreferrer"&gt;Practice on LabEx →&lt;/a&gt; | &lt;a href="https://labex.io/tutorials/java-overloading-and-overriding-178549" rel="noopener noreferrer"&gt;Tutorial →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Implement Countdown Timer Thread
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog-image.labex.io%2Flabs%2Fjava-implement-countdown-timer-thread-179696" 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%2Fog-image.labex.io%2Flabs%2Fjava-implement-countdown-timer-thread-179696" alt="Implement Countdown Timer Thread" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Beginner | &lt;strong&gt;Time:&lt;/strong&gt; 5 minutes&lt;/p&gt;

&lt;p&gt;In this challenge, we will be implementing a countdown timer. The objective is to create a child thread, handle time calculations using the Thread.sleep() method, and display the countdown effect based on the input number of seconds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/labs/java-implement-countdown-timer-thread-179696" rel="noopener noreferrer"&gt;Practice on LabEx →&lt;/a&gt; | &lt;a href="https://labex.io/tutorials/java-implement-countdown-timer-thread-179696" rel="noopener noreferrer"&gt;Tutorial →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Class and Object
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog-image.labex.io%2Flabs%2Fjava-class-and-object-178544" 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%2Fog-image.labex.io%2Flabs%2Fjava-class-and-object-178544" alt="Class and Object" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Beginner | &lt;strong&gt;Time:&lt;/strong&gt; 5 minutes&lt;/p&gt;

&lt;p&gt;In this lab, you are going to learn a very important programming pattern: the object-oriented-programming. You need to know the difference between class and object. Take more practice to get a better understanding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/labs/java-class-and-object-178544" rel="noopener noreferrer"&gt;Practice on LabEx →&lt;/a&gt; | &lt;a href="https://labex.io/tutorials/java-class-and-object-178544" rel="noopener noreferrer"&gt;Tutorial →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Implement Encryption and Decryption
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fog-image.labex.io%2Flabs%2Fjava-implement-encryption-and-decryption-179698" 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%2Fog-image.labex.io%2Flabs%2Fjava-implement-encryption-and-decryption-179698" alt="Implement Encryption and Decryption" width="1200" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Beginner | &lt;strong&gt;Time:&lt;/strong&gt; 5 minutes&lt;/p&gt;

&lt;p&gt;In this challenge, we will be implementing encryption and decryption operations based on a set of encryption rules. The encryption rules involve moving the ASCII code of each character in the plaintext forward by a certain length, reversing the result characters, and then moving the ASCII code backward by another length. Our task is to design a program that can perform these encryption and decryption operations based on the given rules. We have a code template provided, and we need to complete the code in the designated areas to meet the requirements of the challenge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://labex.io/labs/java-implement-encryption-and-decryption-179698" rel="noopener noreferrer"&gt;Practice on LabEx →&lt;/a&gt; | &lt;a href="https://labex.io/tutorials/java-implement-encryption-and-decryption-179698" rel="noopener noreferrer"&gt;Tutorial →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Java is more than just syntax; it is a way of structuring logic to solve complex problems. By completing these five labs, you have moved beyond simple 'Hello World' examples and into the realm of functional application development. Don't just read about code—start building it today and see how quickly your confidence grows.&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>coding</category>
    </item>
  </channel>
</rss>
