1# Zed
2
3[](https://github.com/zed-industries/zed/actions/workflows/ci.yml)
4
5Welcome to Zed, a lightning-fast, collaborative code editor that makes your dreams come true.
6
7## Development tips
8
9### Dependencies
10
11* Install [Postgres.app](https://postgresapp.com) and start it.
12* Install the `LiveKit` server and the `foreman` process supervisor:
13
14 ```
15 brew install livekit
16 brew install foreman
17 ```
18
19* Ensure the Zed.dev website is checked out in a sibling directory:
20
21 ```
22 cd ..
23 git clone https://github.com/zed-industries/zed.dev
24 ```
25
26* Set up a local `zed` database and seed it with some initial users:
27
28 ```
29 script/bootstrap
30 ```
31
32### Testing against locally-running servers
33
34Start the web and collab servers:
35
36```
37foreman start
38```
39
40If you want to run Zed pointed at the local servers, you can run:
41
42```
43script/zed-with-local-servers
44# or...
45script/zed-with-local-servers --release
46```
47
48### Dump element JSON
49
50If you trigger `cmd-alt-i`, Zed will copy a JSON representation of the current window contents to the clipboard. You can paste this in a tool like [DJSON](https://chrome.google.com/webstore/detail/djson-json-viewer-formatt/chaeijjekipecdajnijdldjjipaegdjc?hl=en) to navigate the state of on-screen elements in a structured way.
51
52### Staff Only Features
53
54Many features (e.g. the terminal) take significant time and effort before they are polished enough to be released to even Alpha users. But Zed's team workflow relies on fast, daily PRs and there can be large merge conflicts for feature branchs that diverge for a few days. To bridge this gap, there is a `staff_mode` field in the Settings that staff can set to enable these unpolished or incomplete features. Note that this setting isn't leaked via autocompletion, but there is no mechanism to stop users from setting this anyway. As initilization of Zed components is only done once, on startup, setting `staff_mode` may require a restart to take effect. You can set staff only key bindings in the `assets/keymaps/internal.json` file, and add staff only themes in the `styles/src/themes/internal` directory
55
56### Experimental Features
57
58A user facing feature flag can be added to Zed by:
59
60* Adding a setting to the crates/settings/src/settings.rs FeatureFlags struct. Use a boolean for a simple on/off, or use a struct to experiment with different configuration options.
61* If the feature needs keybindings, add a file to the `assets/keymaps/experiments/` folder, then update the `FeatureFlags::keymap_files()` method to check for your feature's flag and add it's keybindings's path to the method's list.
62* If you want to add an experimental theme, add it to the `styles/src/themes/experiments` folder
63
64The Settings global should be initialized with the user's feature flags by the time the feature's `init(cx)` equivalent is called.
65
66To promote an experimental feature to a full feature:
67
68* If this is an experimental theme, move the theme file from the `styles/src/themes/experiments` folder to the `styles/src/themes/` folder
69* Take the features settings (if any) and add them under a new variable in the Settings struct. Don't forget to add a `merge()` call in `set_user_settings()`!
70* Take the feature's keybindings and add them to the default.json (or equivalent) file
71* Remove the file from the `FeatureFlags::keymap_files()` method
72* Remove the conditional in the feature's `init(cx)` equivalent.
73
74
75That's it 😸
76
77### Wasm Plugins
78
79Zed has a Wasm-based plugin runtime which it currently uses to embed plugins. To compile Zed, you'll need to have the `wasm32-wasi` toolchain installed on your system. To install this toolchain, run:
80
81```bash
82rustup target add wasm32-wasi
83```
84
85Plugins can be found in the `plugins` folder in the root. For more information about how plugins work, check the [Plugin Guide](./crates/plugin_runtime/README.md) in `crates/plugin_runtime/README.md`.