Docs Syntax Help logo

Docs Syntax Help

Organization
elastic
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.

Overview

Publisherelastic
Repositoryelastic-docs-skills
Skill namedocs-syntax-help
Stars
71
Forks
10
Bundled files
1
LicenseApache-2.0
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 1 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by elastic on GitHub. Read the source before you install it.

Installation

Install the Docs Syntax Help AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/elastic/elastic-docs-skills.git /tmp/elastic-docs-skills
mkdir -p .claude/skills
cp -r /tmp/elastic-docs-skills/skills/authoring/docs-syntax-help .claude/skills/docs-syntax-help
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Docs Syntax Help in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Docs Syntax Help on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Docs Syntax Help is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

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

In-repo page links: Default to auto-generated link text ([](page.md)). The published label is the target page title.

[](../path/to/page.md)
[](/absolute/path/to/page.md)

Custom link text is allowed when it contextualizes the link. Do not write custom text that restates the page title.

You might want to set up [rules](create-manage-rules.md).

Anti-pattern: [Create and manage {{kib}} alerting rules](create-manage-rules.md) when that string is the page title. Write [](create-manage-rules.md) instead.

Anchors: Do not use auto-generated link text. Write explicit link text for in-repo section links and same-page jumps.

[Link text](/absolute/path/to/page.md#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.

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, f1f12, plus, pipe.

Inline formatting

SyntaxResult
**bold**Bold
_italic_Italic
`code`Monospace
~~strike~~Strikethrough
H~2~OSubscript
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
- 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

MistakeFix
Mismatched colon count on nested directivesOuter directive needs more colons than inner
Code block inside admonition uses colonsUse backtick fences for code blocks inside directives
Missing space after % in commentsAlways write % comment with a space
Nesting tabs inside tabsNot supported — flatten them
Lists indented 2 spacesIndent 4 spaces for nesting and content under list items
Images outside toc.yml/docset.yml folderMove images inside the folder tree
Footnote definitions inside directivesMove to document level
subs=true on regular inline codeUse {subs=true}`code` role syntax
Mixing explicit and automatic callouts in a code blockUse only one callout type per block
Explicit callout count mismatchNumber 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. When writing or editing docs, default to [](page.md) for in-repo links to whole pages. Custom link text is allowed only when it contextualizes the link. Do not restate the page title as link text. Use explicit link text for anchors, cross-repository links, and external links.
  6. For advanced or edge-case questions, consult the reference pages:

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Docs Syntax Help AI skill do?

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.

Why use Docs Syntax Help on TypingMind?

Because you install it once and use it with any model. Docs Syntax Help is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Docs Syntax Help in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/elastic/elastic-docs-skills/tree/main/skills/authoring/docs-syntax-help. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Docs Syntax Help?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Docs Syntax Help?

As many as you like. As long as a model supports skills, you can use Docs Syntax Help with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Docs Syntax Help AI skill free?

Yes. It is published on GitHub by elastic under the Apache-2.0 license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇