|
| 1 | +# Zed Documentation Conventions |
| 2 | + |
| 3 | +This document covers structural conventions for Zed documentation: what to document, how to organize it, and when to create new pages. |
| 4 | + |
| 5 | +For voice, tone, and writing style, see the [brand-voice/](./brand-voice/) directory, which contains: |
| 6 | + |
| 7 | +- `SKILL.md` — Core voice principles and workflow |
| 8 | +- `rubric.md` — 8-point scoring criteria for quality |
| 9 | +- `taboo-phrases.md` — Patterns and phrases to avoid |
| 10 | +- `voice-examples.md` — Before/after transformation examples |
| 11 | + |
| 12 | +--- |
| 13 | + |
| 14 | +## What Needs Documentation |
| 15 | + |
| 16 | +### Document |
| 17 | + |
| 18 | +- **New user-facing features** — Anything users interact with directly |
| 19 | +- **New settings or configuration options** — Include the setting key, type, default value, and example |
| 20 | +- **New keybindings or commands** — Use `{#action ...}` and `{#kb ...}` syntax |
| 21 | +- **All actions** — Completeness matters; document every action, not just non-obvious ones |
| 22 | +- **New AI capabilities** — Agent tools, providers, workflows |
| 23 | +- **New providers or integrations** — LLM providers, MCP servers, external agents |
| 24 | +- **New tools** — Agent tools, MCP tools, built-in tools |
| 25 | +- **New UI panels or views** — Any new panel, sidebar, or view users interact with |
| 26 | +- **Public extension APIs** — For extension developers |
| 27 | +- **Breaking changes** — Even if the fix is simple, document what changed |
| 28 | +- **Version-specific behavior changes** — Include version callouts (e.g., "In Zed v0.224.0 and above...") |
| 29 | + |
| 30 | +### Skip |
| 31 | + |
| 32 | +- **Internal refactors** — No user-visible change, no docs |
| 33 | +- **Bug fixes** — Unless the fix reveals that existing docs were wrong |
| 34 | +- **Performance improvements** — Unless user-visible (e.g., startup time) |
| 35 | +- **Test changes** — Never document tests |
| 36 | +- **CI/tooling changes** — Internal infrastructure |
| 37 | + |
| 38 | +--- |
| 39 | + |
| 40 | +## Page vs. Section Decisions |
| 41 | + |
| 42 | +### Create a new page when: |
| 43 | + |
| 44 | +- Introducing a **major feature** with multiple sub-features (e.g., Git integration, Vim mode) |
| 45 | +- The topic requires **extensive configuration examples** |
| 46 | +- Users would search for it **by name** (e.g., "Zed terminal", "Zed snippets") |
| 47 | +- It's a **new category** (e.g., a new AI provider type) |
| 48 | + |
| 49 | +### Add to an existing page when: |
| 50 | + |
| 51 | +- Adding a **setting** to a feature that already has a page |
| 52 | +- Adding a **keybinding** to an existing feature |
| 53 | +- The change is a **minor enhancement** to existing functionality |
| 54 | +- It's a **configuration option** for an existing feature |
| 55 | + |
| 56 | +### Examples |
| 57 | + |
| 58 | +| Change | Action | |
| 59 | +| ------------------------------------ | -------------------------------------- | |
| 60 | +| New "Stash" feature for Git | Add section to `git.md` | |
| 61 | +| New "Remote Development" capability | Create `remote-development.md` | |
| 62 | +| New setting `git.inline_blame.delay` | Add to existing Git config section | |
| 63 | +| New AI provider (e.g., "Ollama") | Add section to `llm-providers.md` | |
| 64 | +| New agent tool category | Potentially new page, depends on scope | |
| 65 | + |
| 66 | +--- |
| 67 | + |
| 68 | +## Document Structure |
| 69 | + |
| 70 | +### Frontmatter |
| 71 | + |
| 72 | +Every doc page needs YAML frontmatter: |
| 73 | + |
| 74 | +```yaml |
| 75 | +--- |
| 76 | +title: Feature Name - Zed |
| 77 | +description: One sentence describing what this page covers. Used in search results. |
| 78 | +--- |
| 79 | +``` |
| 80 | + |
| 81 | +- `title`: Feature name, optionally with "- Zed" suffix for SEO |
| 82 | +- `description`: Concise summary for search engines and link previews |
| 83 | + |
| 84 | +### Section Ordering |
| 85 | + |
| 86 | +1. **Title** (`# Feature Name`) — Clear, scannable |
| 87 | +2. **Opening paragraph** — What this is and why you'd use it (1-2 sentences) |
| 88 | +3. **Getting Started / Usage** — How to access or enable it |
| 89 | +4. **Core functionality** — Main features and workflows |
| 90 | +5. **Configuration** — Settings, with JSON examples |
| 91 | +6. **Keybindings / Actions** — Reference tables |
| 92 | +7. **See Also** — Links to related docs |
| 93 | + |
| 94 | +### Section Depth |
| 95 | + |
| 96 | +- Use `##` for main sections |
| 97 | +- Use `###` for subsections |
| 98 | +- Avoid `####` unless absolutely necessary — if you need it, consider restructuring |
| 99 | + |
| 100 | +### Anchor IDs |
| 101 | + |
| 102 | +Add explicit anchor IDs to sections users might link to directly: |
| 103 | + |
| 104 | +```markdown |
| 105 | +## Getting Started {#getting-started} |
| 106 | + |
| 107 | +### Configuring Models {#configuring-models} |
| 108 | +``` |
| 109 | + |
| 110 | +Use anchor IDs when: |
| 111 | + |
| 112 | +- The section is a common reference target |
| 113 | +- You need a stable link that won't break if the heading text changes |
| 114 | +- The heading contains special characters that would create ugly auto-generated anchors |
| 115 | + |
| 116 | +--- |
| 117 | + |
| 118 | +## Formatting Conventions |
| 119 | + |
| 120 | +### Code Formatting |
| 121 | + |
| 122 | +Use inline `code` for: |
| 123 | + |
| 124 | +- Setting names: `vim_mode`, `buffer_font_size` |
| 125 | +- Keybindings: `cmd-shift-p`, `ctrl-w h` |
| 126 | +- Commands: `:w`, `:q` |
| 127 | +- File paths: `~/.config/zed/settings.json` |
| 128 | +- Action names: `git::Commit` |
| 129 | +- Values: `true`, `false`, `"eager"` |
| 130 | + |
| 131 | +### Action and Keybinding References |
| 132 | + |
| 133 | +Use Zed's special syntax for dynamic rendering: |
| 134 | + |
| 135 | +- `{#action git::Commit}` — Renders the action name |
| 136 | +- `{#kb git::Commit}` — Renders the keybinding for that action |
| 137 | + |
| 138 | +This ensures keybindings stay accurate if defaults change. |
| 139 | + |
| 140 | +### JSON Examples |
| 141 | + |
| 142 | +Always use the `[settings]` or `[keymap]` annotation: |
| 143 | + |
| 144 | +```json [settings] |
| 145 | +{ |
| 146 | + "vim_mode": true |
| 147 | +} |
| 148 | +``` |
| 149 | + |
| 150 | +```json [keymap] |
| 151 | +{ |
| 152 | + "context": "Editor", |
| 153 | + "bindings": { |
| 154 | + "ctrl-s": "workspace::Save" |
| 155 | + } |
| 156 | +} |
| 157 | +``` |
| 158 | + |
| 159 | +### Tables |
| 160 | + |
| 161 | +Use tables for: |
| 162 | + |
| 163 | +- Action/keybinding reference lists |
| 164 | +- Setting options with descriptions |
| 165 | +- Feature comparisons |
| 166 | + |
| 167 | +Keep tables scannable — avoid long prose in table cells. |
| 168 | + |
| 169 | +### Paragraphs |
| 170 | + |
| 171 | +- Keep paragraphs short (2-3 sentences max) |
| 172 | +- One idea per paragraph |
| 173 | +- Use bullet lists for multiple related items |
| 174 | + |
| 175 | +### Pronouns |
| 176 | + |
| 177 | +Minimize vague pronouns like "it", "this", and "that". Repeat the noun so readers know exactly what you're referring to. |
| 178 | + |
| 179 | +**Bad:** |
| 180 | + |
| 181 | +> The API creates a token after authentication. It should be stored securely. |
| 182 | +
|
| 183 | +**Good:** |
| 184 | + |
| 185 | +> The API creates a token after authentication. The token should be stored securely. |
| 186 | +
|
| 187 | +This improves clarity for both human readers and AI systems parsing the documentation. |
| 188 | + |
| 189 | +### Callouts |
| 190 | + |
| 191 | +Use blockquote callouts for tips, notes, and warnings: |
| 192 | + |
| 193 | +```markdown |
| 194 | +> **Note:** This feature requires signing in. |
| 195 | +
|
| 196 | +> **Tip:** Hold `cmd` when submitting to automatically follow the agent. |
| 197 | +
|
| 198 | +> **Warning:** This action cannot be undone. |
| 199 | +``` |
| 200 | + |
| 201 | +### Version-Specific Notes |
| 202 | + |
| 203 | +When behavior differs by version, be explicit: |
| 204 | + |
| 205 | +```markdown |
| 206 | +> **Note:** In Zed v0.224.0 and above, tool approval is controlled by `agent.tool_permissions.default`. |
| 207 | +``` |
| 208 | + |
| 209 | +Include the version number and what changed. This helps users on older versions understand why their behavior differs. |
| 210 | + |
| 211 | +--- |
| 212 | + |
| 213 | +## Cross-Linking |
| 214 | + |
| 215 | +### Internal Links |
| 216 | + |
| 217 | +Link to other docs using relative paths: |
| 218 | + |
| 219 | +- `[Vim mode](./vim.md)` |
| 220 | +- `[AI configuration](./ai/configuration.md)` |
| 221 | + |
| 222 | +### External Links |
| 223 | + |
| 224 | +- Link to `zed.dev` pages when appropriate |
| 225 | +- Link to upstream documentation (e.g., Tree-sitter, language servers) when explaining integrations |
| 226 | + |
| 227 | +### "See Also" Sections |
| 228 | + |
| 229 | +End pages with related links when helpful: |
| 230 | + |
| 231 | +```markdown |
| 232 | +## See also |
| 233 | + |
| 234 | +- [Agent Panel](./agent-panel.md): Agentic editing with file read/write |
| 235 | +- [Inline Assistant](./inline-assistant.md): Prompt-driven code transformations |
| 236 | +``` |
| 237 | + |
| 238 | +--- |
| 239 | + |
| 240 | +## Language-Specific Documentation |
| 241 | + |
| 242 | +Language docs in `src/languages/` follow a consistent structure: |
| 243 | + |
| 244 | +1. Language name and brief description |
| 245 | +2. Installation/setup (if needed) |
| 246 | +3. Language server configuration |
| 247 | +4. Formatting configuration |
| 248 | +5. Language-specific settings |
| 249 | +6. Known limitations (if any) |
| 250 | + |
| 251 | +Keep language docs focused on Zed-specific configuration, not general language tutorials. |
| 252 | + |
| 253 | +--- |
| 254 | + |
| 255 | +## Settings Documentation |
| 256 | + |
| 257 | +When documenting settings: |
| 258 | + |
| 259 | +1. **Show the Settings Editor (UI) approach first** — Most settings have UI support |
| 260 | +2. **Then show JSON** as "or add to your settings file:" |
| 261 | +3. **State the setting key** in code formatting |
| 262 | +4. **Describe what it does** in one sentence |
| 263 | +5. **Show the type and default** if not obvious |
| 264 | +6. **Provide a complete JSON example** |
| 265 | + |
| 266 | +Example: |
| 267 | + |
| 268 | +> Configure inline blame in Settings ({#kb zed::OpenSettings}) by searching for "inline blame", or add to your settings file: |
| 269 | +> |
| 270 | +> ```json [settings] |
| 271 | +> { |
| 272 | +> "git": { |
| 273 | +> "inline_blame": { |
| 274 | +> "enabled": false |
| 275 | +> } |
| 276 | +> } |
| 277 | +> } |
| 278 | +> ``` |
| 279 | +
|
| 280 | +For JSON-only settings (complex types without UI support), note this and link to instructions: |
| 281 | +
|
| 282 | +> Add the following to your settings file ([how to edit](./configuring-zed.md#settings-files)): |
| 283 | +
|
| 284 | +### Settings File Locations |
| 285 | +
|
| 286 | +- **macOS/Linux:** `~/.config/zed/settings.json` |
| 287 | +- **Windows:** `%AppData%\Zed\settings.json` |
| 288 | +
|
| 289 | +### Keymap File Locations |
| 290 | +
|
| 291 | +- **macOS/Linux:** `~/.config/zed/keymap.json` |
| 292 | +- **Windows:** `%AppData%\Zed\keymap.json` |
| 293 | +
|
| 294 | +--- |
| 295 | +
|
| 296 | +## Terminology |
| 297 | +
|
| 298 | +Use consistent terminology throughout: |
| 299 | +
|
| 300 | +| Use | Instead of | |
| 301 | +| --------------- | -------------------------------------- | |
| 302 | +| folder | directory | |
| 303 | +| project | workspace | |
| 304 | +| Settings Editor | settings UI | |
| 305 | +| command palette | command bar | |
| 306 | +| panel | sidebar (be specific: "Project Panel") | |
| 307 | +
|
| 308 | +--- |
| 309 | +
|
| 310 | +## Formatting Requirements |
| 311 | +
|
| 312 | +All documentation must pass **Prettier** formatting (80 character line width): |
| 313 | +
|
| 314 | +```sh |
| 315 | +cd docs && npx prettier --check src/ |
| 316 | +``` |
| 317 | +
|
| 318 | +Before any documentation change is considered complete: |
| 319 | + |
| 320 | +1. Run Prettier to format: `cd docs && npx prettier --write src/` |
| 321 | +2. Verify it passes: `cd docs && npx prettier --check src/` |
| 322 | + |
| 323 | +--- |
| 324 | + |
| 325 | +## Quality Checklist |
| 326 | + |
| 327 | +Before finalizing documentation: |
| 328 | + |
| 329 | +- [ ] Frontmatter includes `title` and `description` |
| 330 | +- [ ] Opening paragraph explains what and why |
| 331 | +- [ ] Settings show UI first, then JSON examples |
| 332 | +- [ ] Actions use `{#action ...}` and `{#kb ...}` syntax |
| 333 | +- [ ] All actions are documented (completeness matters) |
| 334 | +- [ ] Anchor IDs on sections likely to be linked |
| 335 | +- [ ] Version callouts where behavior differs by release |
| 336 | +- [ ] No orphan pages (linked from somewhere) |
| 337 | +- [ ] Passes Prettier formatting check |
| 338 | +- [ ] Passes brand voice rubric (see `brand-voice/rubric.md`) |
| 339 | + |
| 340 | +--- |
| 341 | + |
| 342 | +## Gold Standard Examples |
| 343 | + |
| 344 | +See `../.doc-examples/` for curated examples of well-documented features. Use these as templates when writing new documentation. |
| 345 | + |
| 346 | +--- |
| 347 | + |
| 348 | +## Reference |
| 349 | + |
| 350 | +For automation-specific rules (safety constraints, change classification, output formats), see `docs/AGENTS.md`. |
0 commit comments