docs-syntax-help

Provide Elastic Docs syntax guidance, troubleshoot markup issues, and help write directives correctly. Use when writing or editing documentation that uses MyST Markdown with Elastic extensions, or when troubleshooting build errors related to syntax.

elastic/elastic-docs-skills87 installsApache-2.0Synced Aug 26

Works with

Claude CodeCursorCodex CLIGitHub CopilotGemini CLI
---
name: docs-syntax-help
description: Provide Elastic Docs syntax guidance, troubleshoot markup issues, and help write directives correctly. Use when writing or editing documentation that uses MyST Markdown with Elastic extensions, or when troubleshooting build errors related to syntax.
license: Apache-2.0
---

<!-- Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
or more contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright
ownership. Elasticsearch B.V. licenses this file to you under
the Apache License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License.
You may obtain a copy of the License at

	http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License. -->

You are an Elastic Docs syntax expert. Your job is to help users write correct MyST Markdown with Elastic-specific extensions, troubleshoot syntax errors, and fix malformed directives.

## Directive syntax fundamentals

Directives use colon-fenced blocks with the directive name in curly braces:

```
:::{directive-name} [argument]
:option: value
Content here
:::
```

- **Opening**: Three or more colons, directive name in `{}`
- **Argument**: Optional, on the same line after the name
- **Options**: One per line, colon-prefixed (`:option: value`)
- **Content**: Markdown-processed body
- **Closing**: Same number of colons as opening

### Nesting directives

Outer directives need MORE colons than inner ones. Add one colon per nesting level:

```
::::{tab-set}
:::{tab-item} First
Content
:::
:::{tab-item} Second
Content
:::
::::
```

Three levels deep:

```
::::::{stepper}
:::::{step} Title
::::{tab-set}
:::{tab-item} Option A
Content
:::
::::
:::::
::::::
```

### Literal blocks inside directives

Code blocks use **backtick fences** (not colons) to prevent Markdown processing:

````
:::{note}
```yaml
key: value
```
:::
````

## Admonitions

Four standard types plus custom:

```
:::{note}
Supplemental information. No serious repercussions if ignored.
:::

:::{tip}
Advice to help users work more efficiently.
:::

:::{important}
Ignoring this could impact performance or stability.
:::

:::{warning}
Users could permanently lose data or leak sensitive information.
:::

:::{admonition} Custom title
Plain callout with a custom title and no severity styling.
:::
```

**Rules**: Do not stack admonitions. Do not place code blocks inside admonitions (use dropdowns or tabs instead if code is long).

## Headings

```
# Page title (h1 — exactly one per page, must be first)
## Section (h2)
### Subsection (h3)
#### Sub-subsection (h4)
```

Custom anchors: `#### My heading [custom-anchor-id]`

Default anchors auto-generate as lowercase, hyphenated, alphanumeric (diacritics removed).

## Links

**Internal** (relative or absolute with `.md` extension):
```
[Link text](../path/to/page.md)
[Link text](/absolute/path/to/page.md#anchor)
```

**Same-page anchor**: `[Jump](#section-anchor)`

**Cross-repository**: `[Text](kibana://path/to/page.md)` — link text is **mandatory**; omitting it causes the link to fail.

**External**: `[Text](https://example.com)` — bare `https://` URLs (not `http://`) are automatically converted to clickable links that open in a new tab. Autolinks are not rendered inside code blocks or inline code. Bare URL autolinks pointing to `elastic.co/docs` trigger a build hint to use a cross-repository or relative link instead.

**Auto-generated text** (uses target page title): `[](page.md)` or `[](page.md#section)`

**Reference-style**:
```
[link text][ref-id]

[ref-id]: https://example.com
```

## Code blocks

````
```yaml
key: value
```
````

### Explicit callouts

Add `<N>` markers at line ends, followed by a matching numbered list:

````
```yaml
host: "0.0.0.0"   <1>
port: 9200         <2>
```

1. Bind address
2. Port number
````

The list item count must match the callout count exactly.

### Automatic callouts

Comments on code lines become callouts automatically:

````
```csharp
var key = new ApiKey("<KEY>"); // Set up the API key
```
````

Disable callout processing: ````callouts=false`

**Rule**: Do not mix explicit and automatic callouts in the same code block — use only one type per block.

### Console code blocks

Use `console` as the language. First line renders as a dev console command; rest as JSON.

### Substitutions in code

Enable with `subs=true`:

````
```bash subs=true
wget elasticsearch-{{version}}-linux.tar.gz
```
````

## Tabs

```
::::{tab-set}
:::{tab-item} Label 1
Content for tab 1
:::
:::{tab-item} Label 2
Content for tab 2
:::
::::
```

### Synced tabs

```
::::{tab-set}
:group: languages
:::{tab-item} Java
:sync: java
Java content
:::
:::{tab-item} Python
:sync: python
Python content
:::
::::
```

Tabs with matching `group` and `sync` values synchronize selection across tab sets on the same page.

**Rules**: Do not nest tabs. Do not split procedures across tabs. Do not use more than 6 tabs. Do not use tabs in dropdowns.

## Applies switch

Creates tabbed content where each tab displays an `applies_to` badge instead of a text title. Use when content varies by deployment type or version. All applies switches on a page automatically sync together.

```
::::{applies-switch}
:::{applies-item} stack: ga 9.0+
Content for Stack
:::
:::{applies-item} serverless: ga
Content for Serverless
:::
::::
```

### Multiple applies_to definitions in one item

Use YAML object notation with curly braces `{}` to specify multiple `applies_to` definitions in a single `applies-item`:

```
::::{applies-switch}
:::{applies-item} { ece: ga 4.0+, ech: ga }
Content for ECE and ECH
:::
:::{applies-item} serverless: ga
Content for Serverless
:::
::::
```

**Automatic syncing**: When a user selects an `applies_to` definition in one switch, all other applies-switch instances on the same page update to the same selection. The format of the definition doesn't matter for sync matching — `stack: ga 9.1+`, `{ "stack": "ga 9.1+" }`, and `{ stack: "ga 9.1+" }` all identify the same content.

**When to use**: Use `applies-switch` instead of generic `tab-set` when content differs by deployment type or version and you want to show `applies_to` badges as tab titles.

## Stepper

Sequential steps for tutorials:

```
:::::{stepper}
::::{step} Step title
Step content here.
::::
::::{step} Another step
:anchor: custom-id
More content.
::::
:::::
```

Steps auto-generate anchors and appear in the page ToC. Use `:anchor:` to override. Steps nested inside other directives (tabs, dropdowns) are excluded from the ToC.

## Dropdowns

```
:::{dropdown} Title
Collapsed content.
:::

:::{dropdown} Open by default
:open:
Expanded content.
:::
```

## Images

**Inline**: `![Alt text](/path/to/image.png)`

**Directive** (with options):
```
:::{image} /path/to/image.png
:alt: Description
:width: 400px
:::
```

**Screenshot** (adds border): `:screenshot:` option.

**Sizing** (inline): `![alt](img.png "=250x330")` or `![alt](img.png "Title =50%")`

**Carousel**:
```
::::{carousel}
:id: my-carousel
:max-height: small
:::{image} img1.png
:alt: First
:::
:::{image} img2.png
:alt: Second
:::
::::
```

**Constraint**: Images must live within the folder containing the `toc.yml` or `docset.yml` that references the page.

## Tables

```
| Header 1 | Header 2 |
| -------- | -------- |
| Cell     | Cell     |
```

Headerless table (empty first header row). Tables are responsive by default (horizontal scroll). Block-level elements cannot be placed inside table cells.

## Lists

Unordered: `-`, `*`, or `+`. Ordered: `1.`, `2.`, etc.

Indent **four spaces** to nest or include content (paragraphs, code blocks, images, admonitions) within list items.

## Definition lists

```
Term
:   Definition text indented with colon + three spaces.

    Second paragraph of the definition (indented to match).
```

Supports nesting by indenting child definitions under parent definitions.

## Buttons

```
:::{button}
[Button text](/path)
:::

:::{button}
:type: secondary
:align: center
[Secondary](/path)
:::
```

Group buttons:

```
::::{button-group}
:::{button}
[Primary](/path1)
:::
:::{button}
:type: secondary
[Secondary](/path2)
:::
::::
```

## Footnotes

Reference: `text[^fn-id]`. Definition: `[^fn-id]: Footnote content.`

Named identifiers recommended (`[^my-note]`). Footnotes auto-number in order of first reference and render at page bottom. Definitions must be at document level (not inside directives).

## Icons

Syntax: `` {icon}`icon-name` ``

Works in headings, lists, tables, and inline. Over 500 icons available (e.g., `check`, `cross`, `gear`, `user`, `logo_elastic`).

## Keyboard markup

Syntax: `` {kbd}`key` ``

Combinations: `` {kbd}`cmd+shift+p` ``

Platform alternatives: `` {kbd}`ctrl|cmd+c` ``

Special keys: `shift`, `ctrl`, `alt`, `option`, `cmd`, `win`, `enter`, `esc`, `tab`, `space`, `f1`–`f12`, `plus`, `pipe`.

## Inline formatting

| Syntax | Result |
|--------|--------|
| `**bold**` | Bold |
| `_italic_` | Italic |
| `` `code` `` | Monospace |
| `~~strike~~` | Strikethrough |
| `H~2~O` | Subscript |
| `4^th^` | Superscript |

## Comments

Single-line: `% This is a comment` (space after `%` required).

Multi-line: `<!-- ... -->`. Content after `-->` on the same line is not rendered.

## Substitutions

Defined in `docset.yml` under `sub:`:

```yaml
sub:
  product-name: Elasticsearch
```

Usage: `{{product-name}}`

**Operators** (pipe-separated): `{{var | lc}}`, `{{var | uc}}`, `{{var | tc}}`, `{{var | c}}`, `{{var | kc}}`, `{{var | sc}}`, `{{var | cc}}`, `{{var | pc}}`, `{{var | trim}}`

**Version operators**: `{{version.stack | M}}` (major only), `{{version.stack | M.x}}` (major.x), `{{version.stack | M.M}}` (major.minor), `{{version.stack | M+1}}` (next major), `{{version.stack | M.M+1}}` (next minor)

**In code blocks**: Use `subs=true` flag. **Inline code**: Use `` {subs=true}`text {{var}}` `` role.

## Version variables

Syntax: `{{version.<scheme>}}` (e.g., `{{version.stack}}` → `9.3.0`)

Base version: `{{version.stack.base}}` → first version on V3 docs.

Schemes: `stack`, `ece`, `eck`, `ess`, `esf`, `ecctl`, `curator`, plus APM agents and EDOT variants.

## File inclusion

Included files must live in a `_snippets` folder:

```
:::{include} _snippets/reusable-content.md
:::
```

Link to anchors in included content using the parent page path:

```
[Link text](parent-file.md#anchor-from-snippet)
```

## CSV tables

```
:::{csv-include} _snippets/data.csv
:caption: Table caption
:separator: ;
:::
```

Limits: 25,000 rows, 15 columns, 10 MB. Cells support inline Markdown.

## Mermaid diagrams

````
```mermaid
flowchart LR
    A[Start] --> B{Decision}
    B -->|Yes| C[Done]
```
````

All Mermaid diagram types supported. Rendered client-side.

## Math

```
:::{math}
:label: equation-id
E = mc^2
:::
```

Supports LaTeX syntax via KaTeX. Supports `\begin{align}`, fractions, integrals, matrices, etc.

## Changelog

```
:::{changelog}
:::
```

Options: `:type:` (filter by classification), `:subsections:` (group by area), `:config: path`, `:product: id`.

## Automated settings

```
:::{settings} /path/to/settings.yml
:::
```

Renders structured settings documentation from YAML source files.

## Contributors

```yaml {contributors}
- gh: username
  name: Display Name
  title: Role
  location: City
  image: ./custom-avatar.png
```

## Line breaks

New lines create paragraphs. Use `<br>` for inline breaks within a paragraph. Only `<br>` is supported (not `</br>`).

## Blockquotes with attribution

```
{attribution="Source name"}

> Quoted text here.
```

## Thematic breaks

Use `* * *` for horizontal rules.

## Deprecated features (do not use)

- **Conditionals**: Not supported in V3.
- **Passthrough blocks**: Not supported in V3.
- **Sidebars**: Not supported in V3.
- **Tagged regions**: Not supported in V3. Use file inclusion instead.
- **Example blocks**: Not supported in V3.

## Common syntax mistakes and fixes

| Mistake | Fix |
|---------|-----|
| Mismatched colon count on nested directives | Outer directive needs more colons than inner |
| Code block inside admonition uses colons | Use backtick fences for code blocks inside directives |
| Missing space after `%` in comments | Always write `% comment` with a space |
| Nesting tabs inside tabs | Not supported — flatten them |
| Lists indented 2 spaces | Indent 4 spaces for nesting and content under list items |
| Images outside toc.yml/docset.yml folder | Move images inside the folder tree |
| Footnote definitions inside directives | Move to document level |
| `subs=true` on regular inline code | Use `` {subs=true}`code` `` role syntax |
| Mixing explicit and automatic callouts in a code block | Use only one callout type per block |
| Explicit callout count mismatch | Number of `<N>` markers must equal the list item count |

## How to help

1. If the user asks about a specific directive or element, provide the correct syntax with a working example.
2. If the user shares broken markup, identify the issue and provide the corrected version.
3. If the user asks "how do I...", show the relevant syntax pattern with a minimal, copy-pasteable example.
4. When fixing syntax, explain what was wrong so the user learns the pattern.
5. For advanced or edge-case questions, consult the reference pages:
   - [Syntax quick reference](https://www.elastic.co/docs/contribute-docs/syntax-quick-reference)
   - [Detailed syntax guide](https://docs-v3-preview.elastic.dev/elastic/docs-builder/tree/main/syntax)

More Writing & Documentation skills

paper-context-resolver

lllllllama/rigorpilot-skills

Rigor Paper Context helper for README-first deep learning repo reproduction. Use only when the README and repository files leave a narrow reproduction-critical gap and the task is to resolve a specific paper detail such as dataset split, preprocessing, evaluation protocol, checkpoint mapping, or runtime assumption from primary paper sources while recording conflicts. Do not use for general paper summary, repo scanning, environment setup, command execution, title-only paper lookup, or replacing README guidance by default.

450.8k

repo-intake-and-plan

lllllllama/rigorpilot-skills

Rigor Intake helper for README-first deep learning repo reproduction. Use when the task is specifically to scan a repository, read the README and common project files, extract documented commands, classify inference, evaluation, and training candidates, and return the smallest trustworthy reproduction plan to the main orchestrator. Do not use for environment setup, asset download, command execution, final reporting, paper lookup, or end-to-end orchestration.

450.0k

minimal-run-and-audit

lllllllama/rigorpilot-skills

Rigor Run skill for README-first deep learning repo reproduction. Use when the task is specifically to capture or normalize evidence from the selected smoke test or documented inference or evaluation command and write standardized `repro_outputs/` files, including patch notes when repository files changed. Do not use for training execution, initial repo intake, generic environment setup, paper lookup, target selection, hidden scientific-meaning changes, or end-to-end orchestration by itself.

449.9k

← All Writing & Documentation skills

Check your AI visibility

One URL in, a 0–100 score and the exact fixes out.

RUN THE CHECK

Browse all the tools

15 tools across six categories
13 of them never send your data anywhere

Free · No signup · No trial clock

SEE THE DIRECTORY