# Zed Documentation Conventions

This document covers structural conventions for Zed documentation: what to document, how to organize it, and when to create new pages.

For voice, tone, and writing style, see the [brand-voice/](./brand-voice/) directory, which contains:

- `SKILL.md` — Core voice principles and workflow
- `rubric.md` — 8-point scoring criteria for quality
- `taboo-phrases.md` — Patterns and phrases to avoid
- `voice-examples.md` — Before/after transformation examples

---

## What Needs Documentation

### Document

- **New user-facing features** — Anything users interact with directly
- **New settings or configuration options** — Include the setting key, type, default value, and example
- **New keybindings or commands** — Use `{#action ...}` and `{#kb ...}` syntax
- **All actions** — Completeness matters; document every action, not just non-obvious ones
- **New AI capabilities** — Agent tools, providers, workflows
- **New providers or integrations** — LLM providers, MCP servers, external agents
- **New tools** — Agent tools, MCP tools, built-in tools
- **New UI panels or views** — Any new panel, sidebar, or view users interact with
- **Public extension APIs** — For extension developers
- **Breaking changes** — Even if the fix is simple, document what changed
- **Version-specific behavior changes** — Include version callouts (e.g., "In Zed v0.224.0 and above...")

### Skip

- **Internal refactors** — No user-visible change, no docs
- **Bug fixes** — Unless the fix reveals that existing docs were wrong
- **Performance improvements** — Unless user-visible (e.g., startup time)
- **Test changes** — Never document tests
- **CI/tooling changes** — Internal infrastructure

---

## Page vs. Section Decisions

### Create a new page when:

- Introducing a **major feature** with multiple sub-features (e.g., Git integration, Vim mode)
- The topic requires **extensive configuration examples**
- Users would search for it **by name** (e.g., "Zed terminal", "Zed snippets")
- It's a **new category** (e.g., a new AI provider type)

### Add to an existing page when:

- Adding a **setting** to a feature that already has a page
- Adding a **keybinding** to an existing feature
- The change is a **minor enhancement** to existing functionality
- It's a **configuration option** for an existing feature

### Examples

| Change                               | Action                                 |
| ------------------------------------ | -------------------------------------- |
| New "Stash" feature for Git          | Add section to `git.md`                |
| New "Remote Development" capability  | Create `remote-development.md`         |
| New setting `git.inline_blame.delay` | Add to existing Git config section     |
| New AI provider (e.g., "Ollama")     | Add section to `llm-providers.md`      |
| New agent tool category              | Potentially new page, depends on scope |

---

## Document Structure

### Frontmatter

Every doc page needs YAML frontmatter:

```yaml
---
title: Feature Name - Zed
description: One sentence describing what this page covers. Used in search results.
---
```

- `title`: Feature name, optionally with "- Zed" suffix for SEO
- `description`: Concise summary for search engines and link previews
- Keep frontmatter values as simple single-line `key: value` entries (no
  multiline values, no quotes) for compatibility with the docs postprocessor

#### Frontmatter SEO Guidelines

- Choose one primary keyword/intent phrase for each page
- Write unique `title` values that clearly state the page topic and target user
  intent; aim for ~50-60 characters
- Write `description` values that summarize what the reader can do on the page;
  aim for ~140-160 characters
- Use the primary keyword naturally in the `title` and page body at least once
  (usually in the opening paragraph); avoid keyword stuffing

### Section Ordering

1. **Title** (`# Feature Name`) — Clear, scannable
2. **Opening paragraph** — What this is and why you'd use it (1-2 sentences)
3. **Getting Started / Usage** — How to access or enable it
4. **Core functionality** — Main features and workflows
5. **Configuration** — Settings, with JSON examples
6. **Keybindings / Actions** — Reference tables
7. **See Also** — Links to related docs

### Section Depth

- Use `##` for main sections
- Use `###` for subsections
- Avoid `####` unless absolutely necessary — if you need it, consider restructuring

### Anchor IDs

Add explicit anchor IDs to sections users might link to directly:

```markdown
## Getting Started {#getting-started}

### Configuring Models {#configuring-models}
```

Use anchor IDs when:

- The section is a common reference target
- You need a stable link that won't break if the heading text changes
- The heading contains special characters that would create ugly auto-generated anchors

---

## Formatting Conventions

### Code Formatting

Use inline `code` for:

- Setting names: `vim_mode`, `buffer_font_size`
- Keybindings: `cmd-shift-p`, `ctrl-w h`
- Commands: `:w`, `:q`
- File paths: `~/.config/zed/settings.json`
- Action names: `git::Commit`
- Values: `true`, `false`, `"eager"`

### Action and Keybinding References

Use Zed's special syntax for dynamic rendering:

- {#action git::Commit} — Renders the action name
- {#kb git::Commit} — Renders the keybinding for that action

This ensures keybindings stay accurate if defaults change.

### JSON Examples

Always use the `[settings]` or `[keymap]` annotation:

```json [settings]
{
  "vim_mode": true
}
```

```json [keymap]
{
  "context": "Editor",
  "bindings": {
    "ctrl-s": "workspace::Save"
  }
}
```

### Tables

Use tables for:

- Action/keybinding reference lists
- Setting options with descriptions
- Feature comparisons

Keep tables scannable — avoid long prose in table cells.

### Paragraphs

- Keep paragraphs short (2-3 sentences max)
- One idea per paragraph
- Use bullet lists for multiple related items

### Pronouns

Minimize vague pronouns like "it", "this", and "that". Repeat the noun so readers know exactly what you're referring to.

**Bad:**

> The API creates a token after authentication. It should be stored securely.

**Good:**

> The API creates a token after authentication. The token should be stored securely.

This improves clarity for both human readers and AI systems parsing the documentation.

### Callouts

Use blockquote callouts for tips, notes, and warnings:

```markdown
> **Note:** This feature requires signing in.

> **Tip:** Hold `cmd` when submitting to automatically follow the agent.

> **Warning:** This action cannot be undone.
```

### Version-Specific Notes

When behavior differs by version, be explicit:

```markdown
> **Note:** In Zed v0.224.0 and above, tool approval is controlled by `agent.tool_permissions.default`.
```

Include the version number and what changed. This helps users on older versions understand why their behavior differs.

---

## Cross-Linking

### Internal Links

Link to other docs using relative paths:

- `[Vim mode](./vim.md)`
- `[AI configuration](./ai/configuration.md)`

### External Links

- Link to `zed.dev` pages when appropriate
- Link to upstream documentation (e.g., Tree-sitter, language servers) when explaining integrations

### "See Also" Sections

End pages with related links when helpful:

```markdown
## See also

- [Agent Panel](./agent-panel.md): Agentic editing with file read/write
- [Inline Assistant](./inline-assistant.md): Prompt-driven code transformations
```

### SEO Linking Guidelines

- Ensure each page is reachable from at least one other docs page (no orphan
  pages)
- For non-reference pages, include at least 3 internal links to related docs
  when possible
- Reference pages (for example, `docs/src/reference/*`) can use fewer links when
  extra links would add noise
- Add links to closely related docs where they help users complete the next task
- Use descriptive link text that tells users what they will get on the linked
  page
- For main feature pages with a matching marketing page, include a relevant
  `zed.dev` marketing link in addition to docs links

---

## Language-Specific Documentation

Language docs in `src/languages/` follow a consistent structure:

1. Language name and brief description
2. Installation/setup (if needed)
3. Language server configuration
4. Formatting configuration
5. Language-specific settings
6. Known limitations (if any)

Keep language docs focused on Zed-specific configuration, not general language tutorials.

---

## Settings Documentation

When documenting settings:

1. **Show the Settings Editor (UI) approach first** — Most settings have UI support
2. **Then show JSON** as "or add to your settings file:"
3. **State the setting key** in code formatting
4. **Describe what it does** in one sentence
5. **Show the type and default** if not obvious
6. **Provide a complete JSON example**

Example:

> Configure inline blame in Settings ({#kb zed::OpenSettings}) by searching for "inline blame", or add to your settings file:
>
> ```json [settings]
> {
>   "git": {
>     "inline_blame": {
>       "enabled": false
>     }
>   }
> }
> ```

For JSON-only settings (complex types without UI support), note this and link to instructions:

> Add the following to your settings file ([how to edit](./configuring-zed.md#settings-files)):

### Settings File Locations

- **macOS/Linux:** `~/.config/zed/settings.json`
- **Windows:** `%AppData%\Zed\settings.json`

### Keymap File Locations

- **macOS/Linux:** `~/.config/zed/keymap.json`
- **Windows:** `%AppData%\Zed\keymap.json`

---

## Terminology

Use consistent terminology throughout:

| Use             | Instead of                             |
| --------------- | -------------------------------------- |
| folder          | directory                              |
| project         | workspace                              |
| Settings Editor | settings UI                            |
| command palette | command bar                            |
| panel           | sidebar (be specific: "Project Panel") |

---

## Formatting Requirements

All documentation must pass **Prettier** formatting (80 character line width):

```sh
cd docs && npx prettier --check src/
```

Before any documentation change is considered complete:

1. Run Prettier to format: `cd docs && npx prettier --write src/`
2. Verify it passes: `cd docs && npx prettier --check src/`

---

## Quality Checklist

Before finalizing documentation:

- [ ] Frontmatter includes `title` and `description`
- [ ] Page has a clear primary keyword/intent phrase
- [ ] Primary keyword appears naturally in the page body (no keyword stuffing)
- [ ] Opening paragraph explains what and why
- [ ] Settings show UI first, then JSON examples
- [ ] Actions use `{#action ...}` and `{#kb ...}` syntax
- [ ] All actions are documented (completeness matters)
- [ ] Anchor IDs on sections likely to be linked
- [ ] Version callouts where behavior differs by release
- [ ] No orphan pages (linked from somewhere)
- [ ] Non-reference pages include at least 3 useful internal docs links
- [ ] Main feature pages include a relevant `zed.dev` marketing link
- [ ] Passes Prettier formatting check
- [ ] Passes brand voice rubric (see `brand-voice/rubric.md`)

---

## Gold Standard Examples

See `../.doc-examples/` for curated examples of well-documented features. Use these as templates when writing new documentation.

---

## Reference

For automation-specific rules (safety constraints, change classification, output formats), see `docs/AGENTS.md`.
