This Week at Zed Industries: #7

June 16th, 2023

We've had a rather eventful week at Zed Industries. We announced our intent to "open source Zed on Zed" - a plan that begins with us building out a set of features in Zed that enables users to have discussions on the code itself, rather than through pull requests.

We shipped a popular feature request this week in v0.90.1 - you can now override your global user settings on a per-project basis. The system is actually more flexible than that, in that you can define different settings in various directories of your project, if you want. See the documentation for more details on how to configure folder-specific settings. We also landed a handful of improvements for Elixir development in Zed, and have more on that way!

Here's what each of us has been up to this week:


This week, I've been working on overhauling the assistant panel to introduce some new cool features, like undo/redo support when inserting or deleting messages and laying the groundwork to support collaboration with other users when using the assistant. We're working hard on polishing this new assistant panel, and we are hopeful that it should be ready to go public in the next week or so.

I've also been collaborating with Kirill on inlay support. This required some pretty intense engineering to display hints efficiently, but we're thrilled about the progress and can't wait to ship it soon.


I finished up work on building a minimal feedback viewer into our analytics tool this week. The table allows us to see all feedback at once, or filter down by id, which enables other features we are wanting to add. It's pretty basic at the moment, but I think it covers most of what we need to replace AirTable and adds in some small quality-of-life features I wanted, like clicking on a user's email and having the native email client open with the user's feedback already quoted. I'm not a frontend engineer, so all of this will need some polish at some point 😂.

At the moment, the production build of our analytics tool is experiencing a bug where it is not generating aggregated reports, as it seems the Cloudflare Worker used to talk to OpenAI is never being run. I've tried looking into it a few times this week, but haven't been able to figure it out. Vercel's logging strangely seems to omit the actual log message, so Max helped out by setting up the logs to dump into DataDog. I'll dig more into this today and over the weekend.

Since building the crash dashboard (AKA, the "crashboard"), I've kept it open in a tab and checked it multiple times a day. I realized we should probably not solely rely on manually checking the crashboard and added some basic alerting. Metabase will now check every hour to see if three or more crashes of the same kind has occurred within that hour - if so, it will send email to our inbox. There is room to improve this, such as making the query more sensitive on release days, but it is a good start. This was a pretty minor addition, but I'm always pumped to improve our ability to see and react to crashes.


Throughout the majority of this week, I have worked on refactoring our style generation to make it more streamlined. I also had a chance to jump into assistant panel with Antonio and Nathan. Next week I plan to work with Mikayla on the title bar (again).


HEEx - To start the week, I continued working on Elixir support on Zed. I added support for a templating language called HEEx. In the process, I noticed a bug in the way that Zed was parsing templating languages like HEEx and ERB (a Ruby-based templating language). In certain cases, we would parse code outside of the template as if it were inside the template 😬.

Syntax Tree View - When starting work on this bug, I took an approach that I often turn to when I'm feeling daunted: "First, build the tools that make the problem a joy to debug. Then, joyfully debug the problem." In this case, that approach entailed adding to Zed a syntax tree view. If I could directly observe all of the syntax trees for a given buffer, including the range of each syntax node, I could track down the source of the problem.

Having decided to add this syntax tree view to the application, I wanted it to be high quality. In particular, I wanted to make the rendering of the syntax tree efficient, which isn't totally trivial, since a syntax tree is a very large data structure (generally larger than its corresponding source code). To do this, I needed to add some new APIs to Tree-sitter, for efficiently retrieving the nodes starting from a particular index in a depth-first tree walk.

Once the syntax tree view was implemented, diagnosing the templating-language bug was a breeze.

Directory Scanning - Next, I turned my attention to solving a long-standing resource-usage issue in Zed, that affects projects that contain symlinks pointing outside of the project into very large directories. Today, Zed eagerly scans all of the directories in your project, to maintain an in-memory representation of the directories, suitable for fuzzy matching. If your project folder contains a symlink to $HOME, this eager scanning can proceed endlessly, using way too much RAM.

I'm in the process of making our directory scanning logic lazier in certain cases. This will eliminate the aforementioned bug, and also speed up the file-system syncing that takes place when collaborating in Zed.


This week, I've been focused on adding voice chat to Zed! After wiring through our C api to LiveKit's Swift SDK, I spent the rest of the week learning how macOS app bundling works so we could get authorization to use the microphone. Next week, reworking our title bar (again) to make room for the voice chat UI and some of the other features we have planned.


I'm still entirely inside the hints story: even with all amusing changes Antonio brings in by helping me, making the hints work on par with the rest of Zed experience is challenging. Luckily, we have ways to fuzzy test our protocol and display logic, but even with this written more things need ironing out for the first public version.


I spent most of this week heads-down on building the system to re-install broken language servers. Large portions of the code responsible for managing languages servers has been refactored to allow for this. It's not flashy work, but it's necessary, and the light seems to be appearing at the end of the tunnel for this set of work.


For the first half of the week, I was focused on articulating our vision for open sourcing Zed on Zed. I also spent time pairing on Zed's new assistant panel with Piotr and Antonio, and I demonstrated the assistant for the AI meetup here in Boulder. Excited for everyone to be able to play with it very soon!


Lots of workstreams this week. We are working on a full overhaul to the titlebar to support streaming/voice UI, and a number of other convenience features like switching projects/branches from the titlebar.

here are a number of other design projects in flight for supporting streaming, as well as kicking of some more short term work supporting conversations and the upcoming assistant panel.

The theme refactor continues as well – We've been working on bringing the theme more in line with way GPUI elements work. This will make styling new features much easier.

Haven't had time to share as much as I'd like to publically this week, but I had a lot of fun watching José stream yesterday and I'd love to try something like that in the near future!

Thanks for reading!