This Week at Zed Industries: #13

July 28th, 2023

After the flurry of updates in the last two weeks, we're all settling back into long term projects. We've got channels, GPUI updates, and lots of little tweaks and improvements.


Very slow week: besides bugfixing, I am trying to gasp how mouse drag and drop is structured in the code, and turns out it's not so simple. I have a first draft of files drag and drop working, but embedding it into the existing system properly is another, big task.

Feeling rather exhausted, good that I have the vacation starting next week, that should give me better ideas on that big task.


This week, I've been working on Zed's new channels feature. Channels will provide a place to have text-based conversations about code inside of Zed. They will also allow us to make collaboration sessions visible to the public - kind of like a Twitch stream, except more interactive, because spectators will be able to navigate around the shared project themselves. We figured out an initial version of the user experience for creating and joining channels, and we've begun work on implementing them.


I am focused on improving Vim emulation. The main user-visible improvement this week was the mode indicator (with a rocky start in preview, thanks Julia & Mikayla!). In the background I've made progress on ensuring that the Vim selection always matches the Zed selection. This immediately fixes a number of edge-cases, and paves the way for visual block mode and multi-cursor support.


Alot more icon work this week and spend time in figma battling through AI oneshot ideas. Also paired more on upcoming GPUI hottness with Nathan. I created some demo layouts to attempt when the updates are closer to being more universal. Also started noting down some ideas for a settings UI as well as an updated assistant UI.


Channels are on the mind! We've been working on the design for the new channels feature, which will initially let you stream to a channel, add members who can edit your project directly, and share a public link for people to join in a read-only mode. There is a ton to consider here, and we've been working on thinking through all the different paths people take through streaming, and finding all the corner cases in the experience.

Outside of channels, I've been working on a number of smaller things – I shipped an update to our theme system that allows us to style any syntax style captured in our tree-sitter queries, which is built dynamically. Now we no longer need to manually maintain a list of all the different syntax styles we want to support. We just pass in the ones we want to look a specific way in the default theme, and the rest are styled with a default style. This means we can support overrides for any new syntax style without having to update the theme.

There is a bunch more, but this is turning into a novel. Enjoy the weekend!


This week has properly kicked off a major upgrade to our collaboration features. I've been working closely with max to build a new collaboration panel to put the channels information in. The Channels are particularly interesting because we've modeled them as a DAG in the database to enable sharing channels across organizations. But users will primarily interact with them as a tree, originating from some arbitrary node which is not nescessarily a root of the DAG. You could even think of the user's perspective itself as being just another root of the DAG. This gives us a way of expressing lots of interesting social structures in a way that should feel intuitive and powerful. Also, it means getting to write my favorite kind of code: gnarly SQL statements that solve the entire problem with sub queries and recursive with expressions :D


Antonio and I paired on CRDB in the mornings. We focused on equipping the in-memory B-trees that we use to index document fragments and operations with the ability to be persisted to disk. In the afternoons, I continued my quest to improve the experience for designing UI in GPUI based on what we've learned with the system so far. It aint real pretty yet, but here's a peek at what's coming together.

Layout code
Layout code


I had a quite chill week looking into various small bugs, that is until we started to notice a huge influx of panics from our preview channel. While the point of preview is to provide a buffer between potentially terrible bugs and our general user base, this was still something we needed to fix ASAP. Unfortunately the backtrace we had to work with wasn't the most useful and I was on a wild goose chase for much of the day. Thankfully Mikayla came to my rescue with a hunch that a new Vim mode feature she had helped with might be suspect. Once we had a concrete direction to look in it was only a matter of time until we spotted, and then promptly fixed, the cause of the crash.


This week was exciting for me. Apart from the usual community operations and side programming tasks I typically do, I was able to land a few small pull requests in Zed for features I've been wanting. The first was workspace: close all docks (bound by default to alt-cmd-y), which simply closes any of the three docks you might have open in one action. I'd become frustrated with having all docks open and having to quickly launch multiple commands to close them all. The second pull request I incorporated was a set of text manipulation commands: editor: sort lines case sensitive, editor: sort lines case insensitive, editor: reverse lines, and editor: shuffle lines. It feels good to have a bit of control over reordering lines of text. Shoutout to Julia and Mikayla for helping me navigate some questions I had about the Zed codebase. These commands are available in v0.97.