Devpod.sh : Getting Started

Published: Apr 29, 2025 by Isaac Johnson

I’ve had a note to checkout Devpod.sh by Loft. I covered Loft about 3 years ago which gives developers self-service virtual Clusters. Loft has now created a new suite, Devpod.sh, which aims to give developers Codespaces type instances in a variety of providers similar to Coder and Gitpod.

The key difference is that Devpod is driven by a local fat client to set things up. Let’s give it a try and see how Loft works and compares to the other options out there.

Installing

We can go to Devpod.sh to download the client for our OS. In my case, Windows.

/content/images/2025/04/devpod-01.png

I then just run the installer to install Devpod locally

/content/images/2025/04/devpod-02.png

Once installed, we can launch it and get the welcome screen

/content/images/2025/04/devpod-03.png

We’ll need to add the CLI to our path (%APP_DATA%\sh.loft.devpod\bin), which is prompted in step 2

/content/images/2025/04/devpod-04.png

It is in the last step we are presented with “providers” which is where our devpods will live

/content/images/2025/04/devpod-05.png

https://devpod.sh/docs/managing-providers/add-provider https://github.com/loft-sh/devpod/blob/main/providers/docker/provider.yaml

I’ll try adding a Kubernetes provider

/content/images/2025/04/devpod-06.png

Next, I’ll use that Kubernetes provider to create a workspace. It wasn’t obvious to me, but you need to click the provider (make the icon turn purple) to select it and then the “Create Workspace” button becomes active (I assumed with just one provider and it listed it was selected).

/content/images/2025/04/devpod-07.png

We can see devpod now launching, well, a devpod dev pod.

/content/images/2025/04/devpod-08.png

I could see it launched in my cluster

builder@DESKTOP-QADGF36:~$ kubectl get po -n devpod
NAME                      READY   STATUS    RESTARTS   AGE
devpod-default-py-83244   1/1     Running   0          61s

and the moment it completed

/content/images/2025/04/devpod-09.png

A browser was opened to the code-server instance

/content/images/2025/04/devpod-10.png

And we can see it used a basic Python devcontainer which, frankly, surprised me since I didn’t indicate a language. Either python was default or devpod detected I had an app.py and picked the right default devcontainer

/content/images/2025/04/devpod-11.png

GCP Provider

One thing that threw me is the project selected is from a former employer and I have no idea where it picked that up as it was never authed locally on my machine

/content/images/2025/04/devpod-12.png

The defaults for the GCP provider use a bit larger of a host than I typically do so be aware of costs associated to running a c2-standard-4

/content/images/2025/04/devpod-13.png

When I went to add it, I got the error about

cannot list instances: Get "https://compute.googleapis.com/compute/v1/projects/myanthosproject2/zones/asia-east1-a/instances": oauth2: cannot fetch token: 400 Bad Request
Response: {
"error": "invalid_grant",
"error_description": "Bad Request"
}
Try enabling Debug mode under Settings to see a more verbose output
init: exit status 1

/content/images/2025/04/devpod-14.png

However, after I ran a fresh application-default login then it worked

PS C:\Users\isaac> gcloud auth application-default login

/content/images/2025/04/devpod-15.png

I’m now going to try using it with a Private GIT repo - I’m curious if it will prompt for Github creds which are needed to access it

/content/images/2025/04/devpod-17.png

I can see it starting an instance in GCE

/content/images/2025/04/devpod-18.png

which was also viewable in GCP

/content/images/2025/04/devpod-19.png

However, it failed on launch

/content/images/2025/04/devpod-20.png

I’ll try deleting it, which I can confirm deleting the GCE instance as well

/content/images/2025/04/devpod-21.png

I’m now going to try packing in my Github creds to the URL (e.g. https://user:password@github.com/path/to/repo)

/content/images/2025/04/devpod-22.png

Unfortunately, that too failed to work as it detected the @ as a branch indicator

/content/images/2025/04/devpod-23.png

It would seem they want us to use the GIT credential helper locally

I had an idea, I authed locally to Github. This prompted a fresh session and I cloned a private repo in Powershell - this just proved I was now freshly authed to Github in Windows. The repo really didn’t matter - just that it was one of my “private” ones so I could force the Github auth with MFA.

/content/images/2025/04/devpod-24.png

Now I started up Devpod again and voila! it worked… for cloning

/content/images/2025/04/devpod-25.png

It seems to now be annoyed with docker connectivity

[08:46:59] info devcontainer up: build image: get image build info: inspect image ubuntu:jammy: get image config remotely: retrieve image ubuntu:jammy: GET https://auth.docker.io/token?scope=repository%3Alibrary%2Fubuntu%3Apull&service=registry.docker.io: unexpected status code 401 Unauthorized: {"details":"incorrect username or password"}

/content/images/2025/04/devpod-26.png

My Dockerfile is based on Jammy but it seems to just fail on using that

FROM ubuntu:jammy

RUN DEBIAN_FRONTEND=noninteractive apt update -y \
  && umask 0002 \
  && DEBIAN_FRONTEND=noninteractive apt install -y ca-certificates curl apt-transport-https lsb-release gnupg build-essential

# Install Azure CLI
RUN DEBIAN_FRONTEND=noninteractive apt update -y \
  && umask 0002 \
  && DEBIAN_FRONTEND=noninteractive apt install -y ruby-full git sudo

/content/images/2025/04/devpod-27.png

I had the crazy idea of burning an Ubuntu ISO and testing this on a very old laptop (Dell Latitude D830 with Intel Centrino Duo). Would it work on a 64-bit CPU, but one with few cores and just 2Gb of memory?

I busted out a DVD writable, bit of nostalgia there

/content/images/2025/04/20250426_120154.jpg

But alas, Ubuntu 22 doesn’t fit in 4.7Gb anymore so I ended up using a thumb drive.

After setting up some GTK dependencies, indeed the DevPod installer ran and I could launch the GUI

/content/images/2025/04/20250428_153208.jpg

However, it was very slow and I really couldn’t do both a VS Code in browser window and DevPod. That said, I could use Coder’s Code-server just fine

/content/images/2025/04/20250428_162611.jpg

Other Laptop

I moved to another laptop and found the Git binary as provided by Scoop seemed to fall down with every invokation including both private and public repos

/content/images/2025/04/devpod-29.png

I also tried via WSL as both an Linux app and AppImage

/content/images/2025/04/devpod-30.png

However, I could pick a folder and use a WSL path in Devpod

/content/images/2025/04/devpod-35.png

and it quickly fired up the Code-server instance

/content/images/2025/04/devpod-36.png

And I can verify it synced the code successfully (albeit I needed to reauth to view which makes sense)

/content/images/2025/04/devpod-37.png

Pro

There is a new “Pro” (or as they call it “.PRO”) version

/content/images/2025/04/devpod-16.png

There are no prices listed and if we look at vClusters from Loft that has been around a while, we see no prices there either?

/content/images/2025/04/devpod-28.png

Though Slashdot has suggested 20-25/user/month in the past.

Customizations

We can tweak a few things in the UI like orientation of the sidebar and zoom (font size issues)

/content/images/2025/04/devpod-32.png

Or a Dark Theme (albeit in a different area called “Experimental”)

/content/images/2025/04/devpod-33.png

Editors

I just showed Web-based Code server, but there are a lot of options

/content/images/2025/04/devpod-38.png

However, I had the same problem with DevPod as I did with others in that my ingress provider is just https so SSH paths won’t work… or will it?

/content/images/2025/04/devpod-39.png

As I was expecting Timeouts, for some reason I cannot explain, it actually worked and fired a working connection (now I’m impressed)

/content/images/2025/04/devpod-40.png

Other providers

I tried adding SSH

/content/images/2025/04/devpod-42.png

But no amount of effort in windows seemed to unblock SSH

/content/images/2025/04/devpod-43.png

I added Docker and tried to use that

/content/images/2025/04/devpod-44.png

But it seems the Dockerhost is rejecting my connection

/content/images/2025/04/devpod-45.png

I tried 127.0.0.1 but that was also rejected

/content/images/2025/04/devpod-46.png

However, I did find a fix. I needed to allow not TLS calls in Docker Desktop

/content/images/2025/04/devpod-47.png

I then saw it start to build the image

/content/images/2025/04/devpod-48.png

I worked for a while on another host to enable Docker

3 files to edit
builder@bosgamerz9:/etc/docker$ sudo vi /etc/systemd/system/docker.service
builder@bosgamerz9:/etc/docker$ sudo vi /lib/systemd/system/docker.service
builder@bosgamerz9:/etc/docker$ sudo cp /lib/systemd/system/docker.service /etc/systemd/system/
builder@bosgamerz9:/etc/docker$ sudo vi /etc/systemd/system/docker.service
builder@bosgamerz9:/etc/docker$ sudo systemctl daemon-reload
builder@bosgamerz9:/etc/docker$ sudo systemctl start docker
builder@bosgamerz9:/etc/docker$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/etc/systemd/system/docker.service; enabled; preset: enabled)
     Active: active (running) since Mon 2025-04-28 20:57:35 CDT; 5s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 644260 (dockerd)
      Tasks: 39
     Memory: 36.7M (peak: 39.4M)
        CPU: 381ms
     CGroup: /system.slice/docker.service
             ├─644260 /usr/bin/dockerd --containerd=/run/containerd/containerd.sock
             ├─644556 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3356 -container-ip 172.17.0.2 -container-port 8080 -use-listen-fd
             └─644575 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 3356 -container-ip 172.17.0.2 -container-port 8080 -use-listen-fd

Apr 28 20:57:35 bosgamerz9 dockerd[644260]: time="2025-04-28T20:57:35.733637852-05:00" level=warning msg="error locating sandbox id 534ac18a16e0094b7ed93197e9da2844d2123cca41999c2f609361e1888535e4: sandbox 534ac18a16e0094b7ed93197e9da2844d2123cca41999c2f609361e1888535e4 not found"
Apr 28 20:57:35 bosgamerz9 dockerd[644260]: time="2025-04-28T20:57:35.857372132-05:00" level=info msg="Loading containers: done."
Apr 28 20:57:35 bosgamerz9 dockerd[644260]: time="2025-04-28T20:57:35.870933913-05:00" level=warning msg="[DEPRECATION NOTICE]: API is accessible on http://0.0.0.0:2375 without encryption.\n         Access to the remote API is equivalent to root access on the host. Refer\n         to the 'Docker daemon attack surface' section in the documentation for\n         more inform>
Apr 28 20:57:35 bosgamerz9 dockerd[644260]: time="2025-04-28T20:57:35.870970922-05:00" level=info msg="Docker daemon" commit=6430e49 containerd-snapshotter=false storage-driver=overlay2 version=28.0.4
Apr 28 20:57:35 bosgamerz9 dockerd[644260]: time="2025-04-28T20:57:35.871125231-05:00" level=info msg="Initializing buildkit"
Apr 28 20:57:35 bosgamerz9 dockerd[644260]: time="2025-04-28T20:57:35.937730184-05:00" level=info msg="Completed buildkit initialization"
Apr 28 20:57:35 bosgamerz9 dockerd[644260]: time="2025-04-28T20:57:35.940951139-05:00" level=info msg="Daemon has completed initialization"
Apr 28 20:57:35 bosgamerz9 dockerd[644260]: time="2025-04-28T20:57:35.940983510-05:00" level=info msg="API listen on /var/run/docker.sock"
Apr 28 20:57:35 bosgamerz9 dockerd[644260]: time="2025-04-28T20:57:35.941025669-05:00" level=info msg="API listen on [::]:2375"
Apr 28 20:57:35 bosgamerz9 systemd[1]: Started docker.service - Docker Application Container Engine.
builder@bosgamerz9:/etc/docker$ sudo ufw allow 2375/tcp
Skipping adding existing rule
Skipping adding existing rule (v6)
builder@bosgamerz9:/etc/docker$ sudo ufw reload
Firewall not enabled (skipping reload)
builder@bosgamerz9:/etc/docker$ sudo iptables -A INPUT -p tcp --dport 2375 -j ACCEPT
builder@bosgamerz9:/etc/docker$
builder@bosgamerz9:/etc/docker$ cat daemon.json
{
    "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}

But it gets rejected every time

/content/images/2025/04/devpod-49.png

I’ll have to revisit another time as it seems solvable, but so far I’ve been stumped.

Issues

One issue I have with Devpod is when I launched it on a new host, I couldn’t view my existing Workspaces.

I don’t want a system that locks me to a single host.

I even checked with the CLI

PS C:\Users\isaac> devpod list

    NAME | SOURCE | MACHINE | PROVIDER | IDE | LAST USED | AGE | PRO
  -------+--------+---------+----------+-----+-----------+-----+------

Another issue I have is that evidently they used to produce .deb packages which would have made installs easier. Instead we can get an AppImage which requires FUSE or get a compiled binary and play the game of run-then-find-what-is-missing.

Maybe AppImages are the future and I’m just being an old-man-shaking-fist on that one.

Summary

Devpod has promise. There are a slew of providers I didn’t dig into like Docker (mostly because the docs are a bit sparse).

I found it was very easy to use GCP to fire a Compute Engine instance.

I think my only issue is that I can’t pull over a Workspace that was created in a different host.

I do feel this is solvable. After all, the contexts are stored locally in a JSON file

PS C:\Users\isaac\.devpod\contexts\default\workspaces\mytest> cat .\workspace.json
{"id":"mytest","uid":"default-my-cdd05","provider":{"name":"kubernetes","options":{"ARCHITECTURE":{},"INACTIVITY_TIMEOUT":{},"KUBERNETES_CONFIG":{"userProvided":true},"KUBERNETES_CONTEXT":{"value":"ext33","userProvided":true},"KUBERNETES_NAMESPACE":{"value":"devpod","userProvided":true},"POD_TIMEOUT":{"value":"10m"},"STRICT_SECURITY":{"value":"false"},"WORKSPACE_VOLUME_MOUNT":{}}},"machine":{},"ide":{"name":"openvscode"},"source":{"localFolder":"\\\\wsl.localhost\\Ubuntu\\home\\builder\\Workspaces\\devAppNew"},"creationTimestamp":"2025-04-28T23:57:09Z","lastUsed":"2025-04-28T23:58:11Z","context":"default"}

Perhaps I could copy one over if I could figure out the UID part of it. Otherwise, I would want Devpod to add an “export” and “import” option so, at the very least, I could sync them myself.

Perhaps a cloud context option that has a nominal fee might work as well.

The point I’m trying to make is this is a great option for remote development environments, but I want to be able to use this on any host and not have to think about where I fired up a workspace.

However, even with that minor issue, I am really impressed out how feature rich this is already.

I intend to keep using this one and adding it to my Collection along with Coder and Coder’s Code-server.

Non-US options

We live in strange times. I don’t talk politics here (much) so I won’t do it now. But at the time of this writing, there are many in the EU and outside the U.S. looking for non-US options.

The fact that devpod.sh is Open-source and has community plugins that support non-US clouds like CIVO and Hetzner show we could use this without treading into the States

/content/images/2025/04/devpod-41.png

Devpod Codeserver DevOps

Have something to add? Feedback? You can use the feedback form

Isaac Johnson

Isaac Johnson

Cloud Solutions Architect

Isaac is a CSA and DevOps engineer who focuses on cloud migrations and devops processes. He also is a dad to three wonderful daughters (hence the references to Princess King sprinkled throughout the blog).

Theme built by C.S. Rhymes