Zed with AI

Published: Aug 28, 2025 by Isaac Johnson

zed now has a preview of AI tools. I last looked at a year ago in Oct 2024 and I managed to get it working in Windows with a mix of scoop and using Nightly.

Here I’ll try their “preview” release but still mostly with Linux. Let’s dig in!

Installation

I can install from releases by just downloading

/content/images/2025/08/zed-01.png

and running

/content/images/2025/08/zed-02.png

I then pick my project (folder)

/content/images/2025/08/zed-03.png

and start writing

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

However, I’m not thrilled about it not rendering the markdown images (which are there).

/content/images/2025/08/zed-05.png

Though, vi mode is nice and I’m using that presently.

Let’s try and click that AI icon

/content/images/2025/08/zed-06.png

Seems we need to configure an LLM provider

/content/images/2025/08/zed-07.png

I’ll try installing Gemini CLI with the button

/content/images/2025/08/zed-08.png

Looks like it just routes an NPM install to the shell. This particular host is lacking a few tools so let’s fix that.

with nvm installed and node sed to 20

builder@bosgamerz9:~/Downloads$ nvm install lts/iron
Downloading and installing node v20.19.4...
Downloading https://nodejs.org/dist/v20.19.4/node-v20.19.4-linux-x64.tar.xz...
######################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v20.19.4 (npm v10.8.2)
Creating default alias: default -> lts/iron (-> v20.19.4)
builder@bosgamerz9:~/Downloads$ nvm use lts/iron
Now using node v20.19.4 (npm v10.8.2)

Now my install works

/content/images/2025/08/zed-09.png

I felt a bit silly. I put in the API key for Gemini but it just sat there and I saw no save or anything. It took me a few to realize you just need to hit “enter” to save the value

/content/images/2025/08/zed-10.png

I have two issues really now. The first is that the AI button still asks me to configure LLM sources. The second is that when I do click “start thread” from the settings page with Gemini CLI, I get a “you should upgrade dialogue” at the top. I don’t need that.

/content/images/2025/08/zed-11.png

I like how I can see all the model choices

/content/images/2025/08/zed-12.png

However, I clearly have the file in the context view but Gemini Flash’s response is to ask me to paste the markdown which seems odd

/content/images/2025/08/zed-13.png

However, using the @ worked just fine

/content/images/2025/08/zed-14.png

Interestingly enough, after my first usage of Gemini, the AI link in this page now works.

Here I asked for some canned Zed history

/content/images/2025/08/zed-15.png

which you can see below:

Zed History

Zed is a modern code editor developed by the creators of Atom and Tree-sitter, Nathaniel Smith and Max Brunsfeld. It is written in Rust, designed for unparalleled performance and responsiveness. Initially launched for macOS, Zed has since expanded its availability to Linux (including Windows via WSL), bringing its low-latency editing experience and built-in collaborative features to a wider audience. The project’s core philosophy revolves around creating a fast, efficient, and highly productive developer environment.

continuing…

This works quite well, however, I’m missing my devcontainer support and I do not see anything in extensions

/content/images/2025/08/zed-16.png

trying devcontainers

I need to set up the dev container CLI

builder@bosgamerz9:~/Downloads$ npm install -g @devcontainers/cli

added 1 package in 854ms

Then create some zed tasks

builder@bosgamerz9:~/Workspaces/jekyll-blog$ mkdir .zed
builder@bosgamerz9:~/Workspaces/jekyll-blog$ vi .zed/tasks.json
builder@bosgamerz9:~/Workspaces/jekyll-blog$ cat .zed/tasks.json
[
  {
    "label": "DevContainer: Up",
    "command": "devcontainer up --workspace-folder ${ZED_WORKTREE_ROOT}",
    "use_new_terminal": true,
    "allow_concurrent_runs": false,
    "reveal": "always"
  },
  {
    "label": "DevContainer: Build",
    "command": "devcontainer build --workspace-folder ${ZED_WORKTREE_ROOT}",
    "use_new_terminal": true,
    "allow_concurrent_runs": false,
    "reveal": "always"
  },
  {
    "label": "DevContainer: Exec",
    "command": "devcontainer exec --workspace-folder ${ZED_WORKTREE_ROOT} ${1}",
    "use_new_terminal": true,
    "allow_concurrent_runs": true,
    "reveal": "always"
  },
  {
    "label": "DevContainer: Run User Commands",
    "command": "devcontainer run-user-commands --workspace-folder ${ZED_WORKTREE_ROOT}",
    "use_new_terminal": true,
    "allow_concurrent_runs": false,
    "reveal": "always"
  }
]

hoped it might work out of the box so I did a task spawn (ctrl shift p)

/content/images/2025/08/zed-17.png

then a build

/content/images/2025/08/zed-18.png

my first error was about a missing workspace root which was because my “–” turned into hyphens. I fixed that then saw lots of docker related issues. This was because my local user (builder) was added to the docker group, yes, but i never rebooted and for some reason subsequent shells just were not picking that up (tested with docker ps as builder). Once that was sorted, then my build task started but errored on a brew install step:

/content/images/2025/08/zed-19.png

I commented out the problematic line and this time it built the container without issue

/content/images/2025/08/zed-20.png

I can down do a devcontainer up to start the container

/content/images/2025/08/zed-21.png

but exec fails to ask me for a parameter and run user commands does nothing for me

/content/images/2025/08/zed-22.png

I had an idea - the one reason I run a dev container is its setup exactly like my build environment and makes it easy to fire up Jekyll in Ruby (at least the version I have).

Let’s just add a block to fire up Jekyll

{
  "label": "DevContainer: Jekyll",
  "command": "devcontainer exec --workspace-folder ${ZED_WORKTREE_ROOT} bundle exec jekyll serve",
  "use_new_terminal": true,
  "allow_concurrent_runs": false,
  "reveal": "always"
},

Then fire that step off

/content/images/2025/08/zed-23.png

I tried a lot of steps even including adding an iptables map to access the container running behind the scenes. I simply couldn’t access the Jekyll running

/content/images/2025/08/zed-24.png

The forwardPorts should have covered this

// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-dockerfile
{
  "name": "Existing Dockerfile",
  "build": {
    // Sets the run context to one level up instead of the .devcontainer folder.
    "context": "..",
    // Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
    "dockerfile": "../Dockerfile"
  },

  // Features to add to the dev container. More info: https://containers.dev/features.
  // "features": {},

  // Use 'forwardPorts' to make a list of ports inside the container available locally.
  // "forwardPorts": [],

  // Uncomment the next line to run commands after the container is created.
  // "postCreateCommand": "cat /etc/os-release",

  // Configure tool-specific properties.
  // "customizations": {},

  // Uncomment to connect as an existing user other than the container default. More info: https://aka.ms/dev-containers-non-root.
  // "remoteUser": "devcontainer"
  "postCreateCommand": "bundle install",
  "forwardPorts": [4000, 35729]
}

/content/images/2025/08/zed-25.png

it is clearly not picking up the forward ports as we see docker does not expose them

/content/images/2025/08/zed-26.png

Pivot

Let’s just assume this devcontainer support is not the best.

I really just want to use the container and serve up my blog for local testing

I can fire up docker

$ docker run -d --name localdev -v /home/builder/Workspaces/jekyll-blog:/workspaces/jekyll-blog -p 4000:4000 -w /workspaces/jekyll-blog efe56eca99b4 /bin/bash -c "bundle install && bundle exec jekyll serve"
c6730b7ade042bddf712ed6dcf92fe8c4d5779f762f9f48e771909348b0b9ca8

The above makes a container named “localdev”, exposes port 4000 and mounts my workspace. It then will do the bundle install (which can vary) and launch jekyll

I can follow the progress

$ docker logs localdev --follow
Don't run Bundler as root. Installing your bundle as root will break this
application for all non-root users on this machine.
Fetching gem metadata from https://rubygems.org/..........
Fetching https://github.com/sdogruyol/pathutil.git
Fetching rake 12.3.3
Installing rake 12.3.3
Fetching csv 3.3.5
Fetching mercenary 0.3.6
Fetching webrick 1.9.1
Fetching sass-listen 4.0.0
Installing mercenary 0.3.6
Installing sass-listen 4.0.0
Installing csv 3.3.5
Fetching sass 3.7.4
Installing webrick 1.9.1
Installing sass 3.7.4
Fetching jekyll-sass-converter 1.5.2
Installing jekyll-sass-converter 1.5.2
Fetching jekyll 3.10.0
Installing jekyll 3.10.0
Bundle complete! 9 Gemfile dependencies, 35 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
Post-install message from sass:

Ruby Sass has reached end-of-life and should no longer be used.

* If you use Sass as a command-line tool, we recommend using Dart Sass, the new
  primary implementation: https://sass-lang.com/install

* If you use Sass as a plug-in for a Ruby web framework, we recommend using the
  sassc gem: https://github.com/sass/sassc-ruby#readme

* For more details, please refer to the Sass blog:
  https://sass-lang.com/blog/posts/7828841

Configuration file: /workspaces/jekyll-blog/_config.yml
            Source: /workspaces/jekyll-blog
       Destination: /workspaces/jekyll-blog/_site
 Incremental build: disabled. Enable with --incremental
      Generating...
       Jekyll Feed: Generating feed for posts
                    done in 24.985 seconds.
 Auto-regeneration: enabled for '/workspaces/jekyll-blog'
LiveReload address: http://127.0.0.1:35729
    Server address: http://127.0.0.1:4000/
  Server running... press ctrl-c to stop.


However, even that failed me

/content/images/2025/08/zed-27.png

What has me stumped is that if I go into my container, I can pull the index file without issue

root@c6730b7ade04:/workspaces/jekyll-blog# wget http://localhost:4000/
--2025-08-26 14:26:52--  http://localhost:4000/
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:4000... failed: Connection refused.
Connecting to localhost (localhost)|127.0.0.1|:4000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 28452 (28K) [text/html]
Saving to: 'index.html.1'

index.html.1                      100%[===========================================================>]  27.79K  --.-KB/s    in 0s

2025-08-26 14:26:52 (242 MB/s) - 'index.html.1' saved [28452/28452]

Lastly, I had to rule out local machine. I’m using my side rig for LLM work which runs full desktop Ubuntu and has not been used it to edit the site before.

I installed the latest VS Code with the Debian package, per docs then fired it up.

/content/images/2025/08/zed-28.png

It served without issue.

When I consider, at least for my use case, that the preview works better in VS Code and I can use the Continue plugin for Gemini Pro, I don’t think I would switch over

/content/images/2025/08/zed-29.png

There are some things I do really like. I like the native VIM support and the fact that the LLM settings automatically pulled in and listed all the models I have locally in Ollama

/content/images/2025/08/zed-30.png

Also, even though Gemini CLI is installed and configured, it just goes nowhere to click the button

WSL

I went as far as upgrading my main WSL to Ubuntu 22.04 and still zed just hangs when I try and launch it

/content/images/2025/08/zed-32.png

If I set the DISPLAY and GPU values, I get a bit farther

/content/images/2025/08/zed-33.png

As they don’t have a windows binary, this rather rules it out until I switch entirely to Linux.

I tried with “–foreground” to show the errors:

$ WAYLAND_DISPLAY='' ./zed-preview.app/bin/zed --foreground
2025-08-26T13:25:51-05:00 INFO  [zed] ========== starting zed version 0.201.4, sha 1d96a7a ==========
2025-08-26T13:25:51-05:00 INFO  [gpui::platform::linux::x11::client] x11: compositor present: true, gtk_frame_extents_supported: false
2025-08-26T13:25:52-05:00 INFO  [gpui::platform::linux::x11::client] Using RandR scale factor: 1
2025-08-26T13:25:52-05:00 INFO  [zed] Using git binary path: None
2025-08-26T13:25:52-05:00 INFO  [crashes] spawning crash handler process
2025-08-26T13:25:52-05:00 INFO  [extension_host] extensions updated. loading 1, reloading 0, unloading 0
2025-08-26T13:25:52-05:00 INFO  [gpui::platform::linux::platform] activate is not implemented on Linux, ignoring the call
2025-08-26T13:25:52-05:00 ERROR [language_models] Failed to authenticate provider: Google AI: DBus error zbus error I/O error: No such file or directory (os error 2)
2025-08-26T13:25:52-05:00 ERROR [client] DBus error zbus error I/O error: No such file or directory (os error 2)
2025-08-26T13:25:52-05:00 ERROR [language_models] Failed to authenticate provider: Vercel: DBus error zbus error I/O error: No such file or directory (os error 2)
2025-08-26T13:25:52-05:00 ERROR [language_models] Failed to authenticate provider: Anthropic: DBus error zbus error I/O error: No such file or directory (os error 2)
2025-08-26T13:25:52-05:00 ERROR [language_models] Failed to authenticate provider: Amazon Bedrock: DBus error zbus error I/O error: No such file or directory (os error 2)
2025-08-26T13:25:52-05:00 ERROR [language_models] Failed to authenticate provider: OpenAI: DBus error zbus error I/O error: No such file or directory (os error 2)
2025-08-26T13:25:52-05:00 ERROR [language_models] Failed to authenticate provider: OpenRouter: DBus error zbus error I/O error: No such file or directory (os error 2)
2025-08-26T13:25:52-05:00 ERROR [language_models] Failed to authenticate provider: Mistral: DBus error zbus error I/O error: No such file or directory (os error 2)
2025-08-26T13:25:52-05:00 ERROR [language_models] Failed to authenticate provider: DeepSeek: DBus error zbus error I/O error: No such file or directory (os error 2)
2025-08-26T13:25:52-05:00 ERROR [language_models] Failed to authenticate provider: xAI: DBus error zbus error I/O error: No such file or directory (os error 2)
2025-08-26T13:25:52-05:00 INFO  [gpui::platform::linux::x11::window] Using Visual { id: 73, colormap: 0, depth: 32 }
2025-08-26T13:25:52-05:00 INFO  [gpui::platform::linux::x11::window] Creating colormap 6291459
2025-08-26T13:25:52-05:00 INFO  [gpui::platform::blade::blade_renderer] Initializing Blade pipelines for surface SurfaceInfo { format: Bgra8UnormSrgb, alpha: Ignored }
2025-08-26T13:25:52-05:00 INFO  [crashes] connected to crash handler process after 100ms
2025-08-26T13:25:52-05:00 INFO  [crashes] crash handler registered
2025-08-26T13:25:52-05:00 INFO  [gpui::platform::linux::x11::window] x11: no compositor present, falling back to server-side window decorations
2025-08-26T13:25:52-05:00 INFO  [zed::zed] Using GPU: GpuSpecs { is_software_emulated: true, device_name: "llvmpipe (LLVM 15.0.7, 256 bits)", driver_name: "llvmpipe", driver_info: "Mesa 23.2.1-1ubuntu3.1~22.04.3 (LLVM 15.0.7)" }
2025-08-26T13:25:52-05:00 INFO  [gpui::platform::linux::x11::client] Refreshing every 16ms

Gemini CLI

I tried to let Gemini CLI sort it out

/content/images/2025/08/zed-34.png

However, I stopped it when it looked to start making low level system changes

/content/images/2025/08/zed-35.png

Zed in Windows with Scoop

I went back to my old post and used scoop to update the nightly build

/content/images/2025/08/zed-36.png

This says its version 0.156.0 as “nightly”

/content/images/2025/08/zed-37.png

But we can see the Ubuntu has version “0.201.4” so I’m guessing the windows scoop repo is a bit behind.

/content/images/2025/08/zed-50.png

I couldn’t even really tell how old that 0.156.0 is as the history only goes back to 0.188.5 on the zed site

\wsl.localhost\Ubuntu\home\builder\Workspaces\jekyll-blog\content\images\2025\08\zed-38.png

(Though from here I would guess October of 2024)

Summary

zed is a cool editor, I’ll admit. There is lots to like. But Visual Studio Code has a rich ecosystem, code server implementation and a robust Open-Source backend that supports all Operating Systems.

The truth is I like one way of working regardless of OS and so I’ve grown to just enjoy VS Code. I like all the options of GCA, Continue, and Copilot. I really like devcontainers and hosted code servers.

So, for me anyhow, this isn’t enough to switch. But for those using Zed, I think these AI additions are nice and overall, a pretty good implementation.

zed gemini ai vscode

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