<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.rancherdesktop.io/blog/</id>
    <title>Rancher Desktop Blog</title>
    <updated>2026-06-19T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://docs.rancherdesktop.io/blog/"/>
    <subtitle>News and updates from the Rancher Desktop team</subtitle>
    <icon>https://docs.rancherdesktop.io/img/favicon.ico</icon>
    <rights>Copyright © 2026 SUSE Rancher. All Rights Reserved.</rights>
    <entry>
        <title type="html"><![CDATA[Welcome to Rancher Desktop 2.0]]></title>
        <id>https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/</id>
        <link href="https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/"/>
        <updated>2026-06-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Rancher Desktop 2.0 is a ground-up rewrite, and the first build is ready for you]]></summary>
        <content type="html"><![CDATA[<p>Rancher Desktop 2.0 is a ground-up rewrite, and the first build is ready for you
to try. There is an alpha you can download today and run on your own machine.</p>
<p>Let's call it what it is: an early tech preview. It is rough, and not meant for
production. It exists so you can see that 2.0 is real and already running, and
so you can tell us what you would like while the architecture is still soft
enough to change.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-20-is">What 2.0 is<a href="https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#what-20-is" class="hash-link" aria-label="Direct link to What 2.0 is" title="Direct link to What 2.0 is" translate="no">​</a></h2>
<p>We rewrote Rancher Desktop because the old design made every new feature take
more effort than the one before it. The <a href="https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/">history
post</a> tells that story; the short version is
one backend instead of two, the engine lifted out of the GUI, and a different
guest OS underneath. 2.0 is that idea, built.</p>
<p>At the center is a new background program called rdd, the Rancher Desktop
Daemon. rdd does the real work. It runs the virtual machine, using Lima on every
platform now, Windows included. It starts your container engine and your
Kubernetes cluster. It exposes all of that through an API, and not a custom one:
rdd speaks the Kubernetes API. Your kubectl and the usual client libraries can
drive it directly, no new SDK to learn. The desktop app is just one more client,
with no special privileges, talking to rdd the way any other tool would.</p>
<p>Because the work lives in rdd instead of inside a window, you can run the whole
thing without ever opening the GUI. And rdd is one self-contained executable: no
installer, no separate daemon and command-line tool, just one file that is both
the backend and the way you drive it. Download it, start it from the command
line, and you have a container engine and a cluster: on a headless server, on a
CI runner, or in your own terminal. Deploying it is copying one file. Rancher
Desktop never had a way to do this. The engine lived inside the app, and the
app had to be on screen.</p>
<p>The guest VM runs openSUSE Leap now instead of Alpine. The reason is glibc: much
of the GPU and AI tooling people ask for needs it, and Alpine's musl does not
provide it. GPU support is not built yet, but the guest OS no longer rules it
out.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-an-alpha-and-why-now">Why an alpha, and why now<a href="https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#why-an-alpha-and-why-now" class="hash-link" aria-label="Direct link to Why an alpha, and why now" title="Direct link to Why an alpha, and why now" translate="no">​</a></h2>
<p>We could have kept this private until it looked polished. We would rather not.
Putting it out now, rough edges and all, does two things for us.</p>
<p>It shows that "we will do that in 2.0" means a workstream already running, not a
promise about some distant year. And it puts the design in front of you early,
when your feedback still counts. If your setup depends on something specific,
this is the moment to say so, before we lock in decisions we made without you.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-you-can-do-today">What you can do today<a href="https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#what-you-can-do-today" class="hash-link" aria-label="Direct link to What you can do today" title="Direct link to What you can do today" translate="no">​</a></h2>
<p>This is a working preview, not a finished product. What runs right now:</p>
<ul>
<li>Start, stop, and delete Rancher Desktop 2.0, from the GUI or the command line.</li>
<li>Install and run it with no GUI at all: the daemon plus the bundled
command-line tools.</li>
<li>Build and run containers with the Docker (moby) engine.</li>
<li>Manage containers from the dashboard: start, stop, pause, resume, delete.</li>
<li>Turn on Kubernetes (version 1.31 or newer), switch versions, and browse the
cluster in the built-in dashboard.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-not-there-yet">What is not there yet<a href="https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#what-is-not-there-yet" class="hash-link" aria-label="Direct link to What is not there yet" title="Direct link to What is not there yet" translate="no">​</a></h2>
<p>So you are not caught off guard:</p>
<ul>
<li>moby is the only container engine for now.</li>
<li>There is no settings screen. You pick your Kubernetes version from the command
line.</li>
<li>The interface is deliberately thin: containers, images, and volumes, plus the
cluster dashboard. That is the whole UI.</li>
<li>There is no upgrade path between previews. Each new build means a clean slate:
factory reset, then install fresh. It stays that way until 2.0 reaches a real
release.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="it-runs-beside-rancher-desktop">It runs beside Rancher Desktop<a href="https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#it-runs-beside-rancher-desktop" class="hash-link" aria-label="Direct link to It runs beside Rancher Desktop" title="Direct link to It runs beside Rancher Desktop" translate="no">​</a></h2>
<p>You do not have to choose. 2.0 installs next to Rancher Desktop, and the two
ignore each other completely: separate package, separate data, separate
everything. Install them in either order, remove them in either order, nothing
gets tangled. You can even run both at once, though I would not recommend it.
Two container engines and two clusters on one laptop gets confusing quickly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-try-it">How to try it<a href="https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#how-to-try-it" class="hash-link" aria-label="Direct link to How to try it" title="Direct link to How to try it" translate="no">​</a></h2>
<p>The full app, GUI plus bundled tools, comes from the GitHub releases page for
Windows and macOS (Intel and Apple silicon), and from our RPM and DEB
repositories and AppImages on Linux. The same places you would reach for Rancher
Desktop 1. If all you want is the daemon, download the single rdd binary for
your platform and you are two commands away from a running container.</p>
<p>A real <a href="https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/">installation and usage
walkthrough</a> is a separate post in this
series.</p>
<p>This is alpha software. Things will break, especially in corners we have never
tested on a machine configured like yours. When they do, tell us. That feedback
is a big part of why we are shipping this early.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="staying-in-the-loop">Staying in the loop<a href="https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/#staying-in-the-loop" class="hash-link" aria-label="Direct link to Staying in the loop" title="Direct link to Staying in the loop" translate="no">​</a></h2>
<p>There are no docs for 2.0 yet. There is this blog. As the work moves, we will
write about how the pieces fit and what becomes newly possible: the daemon and
its API, networking, snapshots, the AI story, whatever we're working on that
month. To find out when the next preview drops, subscribe to the feed.</p>
<p>Curious, and feeling adventurous? Give it a try. Cautious? Follow along, and
jump in when it looks ready for you.</p>]]></content>
        <author>
            <name>Jan Dubois</name>
            <email>jan.dubois@suse.com</email>
            <uri>https://github.com/jandubois</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Installing and Running Rancher Desktop 2.0]]></title>
        <id>https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/</id>
        <link href="https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/"/>
        <updated>2026-06-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The 2.0 alpha is out, and there are two ways to run it. Install the full]]></summary>
        <content type="html"><![CDATA[<p>The 2.0 alpha is out, and there are two ways to run it. Install the full
desktop app, or skip the GUI and run the new rdd binary straight from your
terminal. Both leave Rancher Desktop alone, and both put you a couple of
commands from a working container engine.</p>
<p>2.0 installs beside Rancher Desktop without touching it: separate package,
separate data, nothing shared. Install or remove them in any order. (The
<a href="https://docs.rancherdesktop.io/blog/welcome-to-rancher-desktop-2/">welcome post</a> covers what 2.0 is and how
it differs; this one is about getting it running.)</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-the-desktop-app">Install the desktop app<a href="https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/#install-the-desktop-app" class="hash-link" aria-label="Direct link to Install the desktop app" title="Direct link to Install the desktop app" translate="no">​</a></h2>
<p>The full app, the GUI plus a set of bundled command-line tools, comes from the
<a href="https://github.com/rancher-sandbox/rancher-desktop-2/releases" target="_blank" rel="noopener noreferrer">releases page</a>
on GitHub. Find the latest alpha and open its <strong>Assets</strong> list.</p>
<p>On macOS, download the <code>.dmg</code> that matches your chip:
<code>Rancher.Desktop-2.0.0-alpha.1.aarch64.dmg</code> on Apple silicon, or the <code>x86_64</code>
build on an Intel Mac. Open it, drag the app into Applications, and launch it
from there.</p>
<p>On Windows, download the installer, <code>Rancher.Desktop.Setup.2.0.0-alpha.1.msi</code>,
and run it. Install WSL2 first if you have not already; 2.0 runs its Linux VM
through WSL2, just as Rancher Desktop does.</p>
<p>On Linux, install from our RPM or DEB repositories or run the AppImage, the
same channels as Rancher Desktop.</p>
<p>The first time you launch the app, it sets up the backend and downloads the
VM image, which can take a while on a slow connection. After that the app is
talking to a running container engine, and you can manage containers, images,
and volumes from its window.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="or-just-the-daemon">Or just the daemon<a href="https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/#or-just-the-daemon" class="hash-link" aria-label="Direct link to Or just the daemon" title="Direct link to Or just the daemon" translate="no">​</a></h2>
<p>If you want a container engine and a cluster with no window on screen, skip the
app and download the single <code>rdd</code> binary instead. It is the whole backend in
one file: no installer, nothing to unpack.</p>
<p>The binaries are on the same releases page. The name is <code>rdd-</code> followed by the
version, the operating system, and the CPU architecture: on an Apple silicon
Mac you want <code>rdd-2.0.0-alpha.1.darwin.aarch64</code>; on x86_64 Linux,
<code>rdd-2.0.0-alpha.1.linux.x86_64</code>. Download the one for your machine, put it on
your <code>PATH</code>, and make it executable:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--location</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> /usr/local/bin/rdd </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  https://github.com/rancher-sandbox/rancher-desktop-2/releases/download/v2.0.0-alpha.1/rdd-2.0.0-alpha.1.darwin.aarch64</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">chmod</span><span class="token plain"> +x /usr/local/bin/rdd</span><br></div></code></pre></div></div>
<p>From there, one command gets you a running container:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">rdd</span><span class="token plain"> run </span><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> run </span><span class="token parameter variable" style="color:#36acaa">--rm</span><span class="token plain"> hello-world</span><br></div></code></pre></div></div>
<p><code>rdd run</code> is the no-commitment way to use 2.0. It starts the daemon if it is
not already up, then runs your command with the <code>PATH</code> and the Docker and
Kubernetes contexts pointed at 2.0 for that command only. It leaves your own
configuration untouched. So if your machine is already set up for Rancher
Desktop, leave it that way and reach for 2.0 with <code>rdd run</code> when you want to
try something. The very first start downloads the openSUSE Leap image and
brings the VM up, which can take a while on a slow connection; after that it is
quick.</p>
<p>Kubernetes works the same way. On a fresh setup, <code>rdd run kubectl get node</code>
enables Kubernetes at the default version and runs against the new cluster,
with no separate step to turn it on:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">rdd</span><span class="token plain"> run </span><span class="token function" style="color:#d73a49">kubectl</span><span class="token plain"> get </span><span class="token function" style="color:#d73a49">node</span><br></div></code></pre></div></div>
<p>That shortcut fires only the first time, while nothing is configured yet. Once
Rancher Desktop exists, choose a version or toggle Kubernetes with <code>rdd set</code>
(1.31 or newer):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">rdd</span><span class="token plain"> </span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">kubernetes.enabled</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">true </span><span class="token assign-left variable" style="color:#36acaa">kubernetes.version</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1.32</span><span class="token plain">.2</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="driving-it">Driving it<a href="https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/#driving-it" class="hash-link" aria-label="Direct link to Driving it" title="Direct link to Driving it" translate="no">​</a></h2>
<p>The same <code>rdd</code> commands drive 2.0 whether you installed the app or only the
binary. The GUI is one more client; underneath, it runs the daemon you do.</p>
<p><code>rdd run</code> is fine for the occasional command. If you reach for 2.0 a lot, put
<code>docker</code>, <code>kubectl</code>, and <code>helm</code> on your <code>PATH</code> directly. The first start
populates <code>~/.rd2/bin</code> with them; add that directory to your <code>PATH</code> yourself,
in this shell and in your profile:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token builtin class-name">export</span><span class="token plain"> </span><span class="token assign-left variable environment constant" style="color:#36acaa">PATH</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"</span><span class="token string environment constant" style="color:#36acaa">$HOME</span><span class="token string" style="color:#e3116c">/.rd2/bin:</span><span class="token string environment constant" style="color:#36acaa">$PATH</span><span class="token string" style="color:#e3116c">"</span><br></div></code></pre></div></div>
<p>This alpha sets up no paths for you, so that line is your job. Both the Docker
and Kubernetes contexts are named <code>rancher-desktop-2</code>, and 2.0 will not take
over a context you already have selected. If you run both side by side, move
between them by switching contexts:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">docker</span><span class="token plain"> context use rancher-desktop-2</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">kubectl</span><span class="token plain"> config use-context rancher-desktop-2</span><br></div></code></pre></div></div>
<p>Managing the backend itself needs no <code>rdd run</code>. <code>rdd start</code> brings it up and
<code>rdd stop</code> takes it down, keeping your data for next time:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">rdd</span><span class="token plain"> start   </span><span class="token comment" style="color:#999988;font-style:italic"># bring the backend up</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">rdd</span><span class="token plain"> stop    </span><span class="token comment" style="color:#999988;font-style:italic"># take it down, keep your data</span><br></div></code></pre></div></div>
<p>There is no upgrade path between previews yet, so each new alpha starts from a
clean slate. <code>rdd svc delete</code> stops the daemon and removes everything 2.0
created, the VM, the cluster, your settings, and the daemon's own data, keeping
only the download cache so a reinstall does not refetch the VM image. It is
also how you uninstall: after it runs, delete the <code>rdd</code> binary or remove the
app. The cache it leaves is Lima's, not ours (<code>~/Library/Caches/lima</code> on macOS,
<code>~/.cache/lima</code> on Linux, <code>~/AppData/Local/lima</code> on Windows); delete it too for
a full reclaim. A later release will handle that for you, clearing distro
images from earlier previews automatically and adding a command to empty the
cache. For the next preview instead, install the new build and start again.</p>
<p>That is the alpha: install it one of two ways, start it, run a container. It
will break on setups we have never seen, and when it does, tell us. Finding out
where it breaks is much of why we shipped it this early.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-glimpse-underneath">A glimpse underneath<a href="https://docs.rancherdesktop.io/blog/installing-rancher-desktop-2/#a-glimpse-underneath" class="hash-link" aria-label="Direct link to A glimpse underneath" title="Direct link to A glimpse underneath" translate="no">​</a></h2>
<p>rdd is a Kubernetes API server in its own right, and Rancher Desktop's own
state lives inside it as Kubernetes objects. <code>rdd ctl</code> is kubectl aimed at that
API. Ask it for the App object and the whole machine prints as YAML: the
container engine, the Kubernetes version it settled on, and the conditions
tracking its progress toward the state you asked for.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># rdd ctl get app -o yaml</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">items</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app.rancherdesktop.io/v1alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> App</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">creationTimestamp</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026-06-17T17:44:58Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">finalizers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> rdd.rancherdesktop.io/cleanup</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">generation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">resourceVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"507"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">uid</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 3ab44aec</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">8949</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">41b8</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">8432</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">03224fe38ce5</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">containerEngine</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> moby</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kubernetes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 1.34.6</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> rancher</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">desktop</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">running</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">conditions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lastTransitionTime</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026-06-19T00:57:05Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Container engine synced</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">observedGeneration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">reason</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Connected</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"True"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ContainerEngineReady</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lastTransitionTime</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026-06-19T00:57:10Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Kubernetes cluster is ready</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">observedGeneration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">reason</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Ready</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"True"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> KubernetesReady</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lastTransitionTime</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026-06-17T17:45:19Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Lima instance created successfully</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">observedGeneration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">reason</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Created</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"True"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Created</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lastTransitionTime</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026-06-19T00:57:10Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> App has reached the desired state</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">observedGeneration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">reason</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Settled</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"True"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Settled</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">lastTransitionTime</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026-06-19T00:57:05Z"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Lima instance is running</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">observedGeneration</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">reason</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Started</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"True"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Running</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kubernetesPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">7443</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> List</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resourceVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><br></div></code></pre></div></div>
<p>This is not the cluster you turned on earlier. It is Rancher Desktop
representing itself through the same API your tools already speak, which means
anything that drives Kubernetes can drive it, no bespoke SDK and no private
protocol. There is a lot to say about that, and it gets a post of its own.</p>]]></content>
        <author>
            <name>Jan Dubois</name>
            <email>jan.dubois@suse.com</email>
            <uri>https://github.com/jandubois</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[A Short History of Rancher Desktop]]></title>
        <id>https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/</id>
        <link href="https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/"/>
        <updated>2026-06-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In October 2020, Rancher Desktop was a tray icon and a single shell command.]]></summary>
        <content type="html"><![CDATA[<p>In October 2020, Rancher Desktop was a tray icon and a single shell command.
Click the icon, and it ran <code>minikube start</code> to bring up a Kubernetes cluster on
your Mac. That was the whole thing: nine files, one good idea, and a note in the
source that read, more or less, <em>this is just a quick proof of concept</em>.</p>
<p>SUSE had just bought Rancher Labs, and the goal was easy to state and hard to
build: make Kubernetes easy on a developer's laptop. We called it Rancher
Desktop because, at the time, "Rancher" was how SUSE said "Kubernetes." That
branding has gotten more complicated since, the way branding does, but the name
stuck.</p>
<p>About seven months later, in May 2021, the first public build shipped: macOS and
Windows, k3s for Kubernetes, an image builder called kim, and a way to switch
Kubernetes versions. It was alpha software and looked like it. Five years on
it's a different program, and the story of how it got here is mostly the story
of how much work it took to keep one simple promise on three operating systems
at once.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="two-operating-systems-two-backends">Two operating systems, two backends<a href="https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#two-operating-systems-two-backends" class="hash-link" aria-label="Direct link to Two operating systems, two backends" title="Direct link to Two operating systems, two backends" translate="no">​</a></h2>
<p>On a Mac, Kubernetes needs a Linux virtual machine. On Windows, it needs WSL2.
So from the very first release, Rancher Desktop had two backends, and we spent
the next five years discovering how different "two backends" really are.</p>
<p>The Mac side never sat still. We started with minikube, dropped it to drive
Apple's Hypervisor.framework via the docker-machine-driver-hyperkit, then
replaced it with Lima and QEMU. Each move was a rebuild of the layer that
creates the VM, installs k3s, and wires up the network. When Apple later shipped
its own Virtualization framework, VZ, moving to it was mostly a matter of
telling Lima to use it. That's the difference a real foundation makes: the next
big change stops being a rebuild.</p>
<p>Windows went its own way, with k3s running inside a dedicated WSL distribution
we imported from an image we built ourselves. When Linux arrived as a tech
preview in late 2021, it didn't add a third backend. It joined the Mac under
Lima, which manages the VM on macOS and Linux alike, and which we got to build
on as an upstream open-source project instead of maintaining alone. That part
worked. macOS and Linux became one backend, where a fix landed once instead of
twice.</p>
<p>Building on Lima also meant building it. Lima started narrow: a way to run
containers with nerdctl on a Mac. The provisioning scripts we added a few weeks
in, the mechanism that runs setup inside a fresh VM, are how Rancher Desktop
installs k3s and a container engine. They also opened up Lima so you could
provision for almost anything. Other contributions are the rules-based port
forwarding configuration and host-based DNS lookup to extend VPN connections
into the VM. What we needed, we built upstream, where every Lima user got to
benefit from it.</p>
<p>Windows stayed separate. We tried more than once to fold the two together but
never fully managed it. The systems were too different: a VM you own end to end
on one side, a WSL distro living under someone else's rules on the other. So
most features had to be built twice, into two backends similar enough to look
the same and different enough to break in their own ways. Every new capability
had to be implemented twice.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-small-guest-with-sharp-edges">A small guest with sharp edges<a href="https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#a-small-guest-with-sharp-edges" class="hash-link" aria-label="Direct link to A small guest with sharp edges" title="Direct link to A small guest with sharp edges" translate="no">​</a></h2>
<p>The VM ran Alpine Linux, picked because it's tiny: a smaller download, a faster
boot. Alpine stays small by using musl and OpenRC instead of the glibc and
systemd most Linux software is built against. Usually that's invisible.
Sometimes it isn't: you can't run the NVIDIA Container Toolkit on it, which
means no CUDA, which means machines with a GPU can't run the AI workloads people
increasingly want to run. A choice that saved a few megabytes early on walled
off a whole category of work once GPUs and AI showed up.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-than-kubernetes">More than Kubernetes<a href="https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#more-than-kubernetes" class="hash-link" aria-label="Direct link to More than Kubernetes" title="Direct link to More than Kubernetes" translate="no">​</a></h2>
<p>We set out to ship Kubernetes, and users kept asking for the rest of the
container toolbox. The first image builder, kim, ran inside the cluster; we
replaced it with nerdctl, the standard containerd CLI, and most people never
noticed kim was gone. Then we hit something we hadn't planned for: a lot of real
projects simply wouldn't build under nerdctl and buildkit. We added moby
(dockerd and the Docker CLI) as a second engine, so those projects would build.
Later we let people turn Kubernetes off entirely and run nothing but the
container engine. Rancher Desktop had quietly grown from "Kubernetes on your
desktop" into "containers and Kubernetes on your desktop."</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="networking-never-got-easy">Networking never got easy<a href="https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#networking-never-got-easy" class="hash-link" aria-label="Direct link to Networking never got easy" title="Direct link to Networking never got easy" translate="no">​</a></h2>
<p>Networking was the part that never stopped being hard. A container's ports, the
right DNS answers, a corporate VPN that doesn't break everything: getting all
three to coexist took years of work on each platform, and little of it carried
across. On macOS the VM reaches the network through a layer called vmnet, where
we moved from one implementation to another and carried both for a while.
Windows needed something else entirely: to keep the VM's network from fighting
the host's VPN, we built a tunnelling network that runs in its own isolated
namespace.</p>
<p>Some of that split is just the operating systems being different; there's no
single answer that works on both. The question a clean design has to get right
isn't how to avoid writing two of them. It's where that code should live, pushed
as far down into the shared foundation as it will go instead of tangled through
the app.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-people-actually-wanted">What people actually wanted<a href="https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#what-people-actually-wanted" class="hash-link" aria-label="Direct link to What people actually wanted" title="Direct link to What people actually wanted" translate="no">​</a></h2>
<p>The request for Linux support surprised us. On Linux you can already run k3s,
containerd, and Docker natively. What does a desktop app add? Not the
containers. The value was being able to throw the whole thing away: a factory
reset that wipes the VM back to nothing, worth a lot when your environment
drifts into a state you no longer understand. People didn't want another way to
run containers. They wanted an undo button for their development machine (and
later, snapshots).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-backend-trapped-in-the-app">A backend trapped in the app<a href="https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#a-backend-trapped-in-the-app" class="hash-link" aria-label="Direct link to A backend trapped in the app" title="Direct link to A backend trapped in the app" translate="no">​</a></h2>
<p>Two things made Rancher Desktop easier to work with, and both ran into the same
wall.</p>
<p>The first was rdctl, a command-line tool for driving Rancher Desktop without
touching the GUI. It let us write our integration tests as plain shell scripts
instead of clicking through the interface, and it let users automate their
setup. But not everything was reachable from it. Port forwarding, for one, still
went through private messaging between the GUI and the backend, never exposed
through the REST API, so the GUI could do things no script could.</p>
<p>The second was snapshots: save the VM's state, restore it later. A simple
feature, an awkward implementation, because the backend has to stop while its
disk is copied, and the backend lives inside the GUI. So taking a snapshot
turned into a small contortion. The GUI launches rdctl, which calls back into
the GUI to ask it to shut its own backend down, takes the snapshot, then asks it
to start back up. Cancelling was worse: there was no clean channel for it, so
the GUI found the running rdctl process and killed it by name.</p>
<p>Underneath both was the same fact: you can't run the backend without the GUI.
You can hide the window, you can tuck it into the background, but the app is
always loaded, because the engine lives inside it. There is no headless Rancher
Desktop. For something a developer wants to script, drop on a CI runner, or hand
to an AI agent to drive, that's real friction.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-five-years-taught-us">What five years taught us<a href="https://docs.rancherdesktop.io/blog/history-of-rancher-desktop/#what-five-years-taught-us" class="hash-link" aria-label="Direct link to What five years taught us" title="Direct link to What five years taught us" translate="no">​</a></h2>
<p>Step back, and a pattern runs through all of it. Every feature got a little more
difficult to implement than the last. Two backends to change in lockstep. An
engine welded to its own UI. A guest OS that couldn't reach the GPU. None of it
was a mistake exactly (each call was reasonable when we made it), but the costs
compounded, until we were spending more time maintaining the existing machinery
than building anything new.</p>
<p>The parts that aged well point the way. Building on Lima gave us one backend for
macOS and Linux and an upstream community to share the load. And the
command-line tool we'd built for our own tests turned out to matter more than we
planned. A tool an AI model can explore and drive on its own is also exactly
what you want now that so much work is handed to agents.</p>
<p>So Rancher Desktop 2.0 starts over, on purpose. One backend across every
platform, Windows included. The backend lifted out of the UI into something you
can run on its own: headless, scripted, snapshotted by itself. A guest that can
talk to your GPU. Not because the first five years were wrong, but because they
taught us exactly what the foundation needed to be. The rest of this blog is
about what we're building on it.</p>]]></content>
        <author>
            <name>Jan Dubois</name>
            <email>jan.dubois@suse.com</email>
            <uri>https://github.com/jandubois</uri>
        </author>
    </entry>
</feed>