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.
I then just run the installer to install Devpod locally
Once installed, we can launch it and get the welcome screen
We’ll need to add the CLI to our path (%APP_DATA%\sh.loft.devpod\bin
), which is prompted in step 2
It is in the last step we are presented with “providers” which is where our devpods will live
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
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).
We can see devpod now launching, well, a devpod dev pod.
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
A browser was opened to the code-server instance
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
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
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
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
However, after I ran a fresh application-default login then it worked
PS C:\Users\isaac> gcloud auth application-default login
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
I can see it starting an instance in GCE
which was also viewable in GCP
However, it failed on launch
I’ll try deleting it, which I can confirm deleting the GCE instance as well
I’m now going to try packing in my Github creds to the URL (e.g. https://user:password@github.com/path/to/repo
)
Unfortunately, that too failed to work as it detected the @
as a branch indicator
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.
Now I started up Devpod again and voila! it worked… for cloning
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"}
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
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
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
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
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
I also tried via WSL as both an Linux app and AppImage
However, I could pick a folder and use a WSL path in Devpod
and it quickly fired up the Code-server instance
And I can verify it synced the code successfully (albeit I needed to reauth to view which makes sense)
Pro
There is a new “Pro” (or as they call it “.PRO
”) version
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?
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)
Or a Dark Theme (albeit in a different area called “Experimental”)
Editors
I just showed Web-based Code server, but there are a lot of options
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?
As I was expecting Timeouts, for some reason I cannot explain, it actually worked and fired a working connection (now I’m impressed)
Other providers
I tried adding SSH
But no amount of effort in windows seemed to unblock SSH
I added Docker and tried to use that
But it seems the Dockerhost is rejecting my connection
I tried 127.0.0.1
but that was also rejected
However, I did find a fix. I needed to allow not TLS calls in Docker Desktop
I then saw it start to build the image
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
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