Skip to content

Markdown Specification

This document describes the Markdown syntax supported by figdeck.

Use --- (thematicBreak, horizontal rule) to separate slides.

# Slide 1
Content
---
# Slide 2
Content

YAML frontmatter allows you to configure slide settings. There are two types of configurations:

Settings at the very beginning of the file (before any content) apply to all slides as defaults.

---
figdeck: true
background: "#1a1a2e"
color: "#ffffff"
transition: dissolve
---
# First Slide
---
## Second Slide

In this example, all slides will have the dark background, white text, and dissolve transition.

Settings placed immediately after a slide separator (---) apply only to that specific slide, overriding any global settings.

---
background: "#1a1a2e"
transition: dissolve
---
# First Slide
Uses global settings (dark background, dissolve)
---
background: "#ffffff"
color: "#000000"
transition: slide-from-right
---
## Second Slide
This slide has white background, black text, and slides from right
---
## Third Slide
Back to global settings (dark background, dissolve)
SettingDescription
figdeckEnable VSCode extension features (true/false)
coverTreat the first slide as a cover (true/false, default: true)
backgroundUnified background: color, gradient, image, template, or Figma component
colorBase text color
headingsHeading styles (h1, h2, h3, h4)
paragraphsParagraph styles
bulletsBullet point styles
codeCode block styles
fontsCustom font configuration
alignHorizontal alignment (left, center, right)
valignVertical alignment (top, middle, bottom)
transitionSlide transition animation
slideNumberSlide number configuration
titlePrefixTitle prefix component

See specific sections below for detailed configuration options.

Headings starting with # create title slides. Font size is 64px and displayed large.

# Presentation Title

Headings starting with ## create content slides. Font size is 48px.

## Agenda

Headings H3 and below are displayed as sub-headings within the slide content.

Paragraph text is displayed as body content on the slide. Multiple paragraphs are displayed separated by line breaks.

## Slide Title
This is body text.
This is also added to the body.

Lists (-, *, + or numbers) are displayed as bullet points.

Displayed with at the beginning.

## Features
- Fast
- Simple
- Extensible

Lists starting with numbers are displayed as numbered lists. You can specify the starting number with the start attribute.

1. First step
2. Next step
3. Last step

Lists can be nested by indenting with 2 spaces. Bullet markers change by nesting level:

  • Level 0: (U+2022)
  • Level 1: (U+25E6)
  • Level 2: (U+25AA)
  • Level 3+: (U+2013)
## Nested Example
- Parent item
- Child item (2 spaces indent)
- Grandchild item
- Great-grandchild item
- Back to parent level

You can customize the spacing between bullet items using the spacing property in YAML frontmatter:

---
bullets:
spacing: 16 # Gap between bullet items (default: 8px)
---
## Wide Spacing
- Item 1
- Item 2
- Item 3

The spacing value is in pixels. The default is 8px.

The following formatting can be used within text:

  • Bold: **text** or __text__
  • Italic: *text* or _text_
  • Strikethrough: ~~text~~ (GFM)
  • Inline code: `code`
  • Link: [text](URL)

These can also be combined:

This is a test of **bold** and *italic* and ~~strikethrough~~.
`const x = 1` is inline code.
A [link to Figma](https://figma.com).

Lines starting with > are displayed as blockquotes. Displayed with a gray border on the left and slightly muted color.

> This is a quoted text.
> It can span multiple lines.

Callouts are styled message blocks for notes, tips, warnings, and cautions. Use the :::note, :::tip, :::warning, or :::caution directive syntax:

:::note
This is a note with important information.
:::
:::tip
A helpful tip for users.
:::
:::warning
Be careful with this feature.
:::
:::caution
This action is irreversible!
:::

Each callout type is displayed with a distinct color:

  • Note (blue): General information or context
  • Tip (green): Helpful suggestions or best practices
  • Warning (orange): Important information to be aware of
  • Caution (red): Critical warnings about potential issues

Callouts support inline formatting including bold, italic, links, and inline code:

:::tip
Use `console.log()` for **debugging** purposes.
Check the [documentation](https://example.com) for more details.
:::

The background property is a unified configuration for all background types. It supports string format (auto-detected) or object format (explicit).

---
# Solid color (hex)
background: "#1a1a2e"
# Gradient
background: "#0d1117:0%,#1f2937:50%,#58a6ff:100%@45"
# Image (local path or URL)
background: "./bg.png"
background: "https://example.com/bg.png"
# Figma component (URL with node-id)
background: "https://www.figma.com/design/YOUR_FILE_KEY?node-id=123-456"
---
---
background:
color: "#1a1a2e" # Solid color
gradient: "#000:0%,#fff:100%@45" # Gradient
template: "Dark Mode" # Figma paint style name
image: "./bg.png" # Image path or URL
component: # Figma component
link: "https://www.figma.com/design/xxx?node-id=123-456"
fit: "cover" # cover | contain | stretch
align: "center" # center | top-left | top-right | bottom-left | bottom-right
opacity: 0.8 # 0-1
---

Component can be combined with color/gradient/image backgrounds. The component renders as a layer on top:

---
background:
color: "#1a1a2e"
component:
link: "https://www.figma.com/design/xxx?node-id=123-456"
opacity: 0.6
---

When multiple properties are specified in object format: template > gradient > color > image

ValueDescription
coverScale to cover entire slide, may crop (default)
containScale to fit within slide, may have empty space
stretchStretch to fill slide, ignores aspect ratio

When using cover or contain, you can specify alignment:

ValueDescription
centerCenter of slide (default)
top-leftTop-left corner
top-rightTop-right corner
bottom-leftBottom-left corner
bottom-rightBottom-right corner
  • Component only works with nodes in the same Figma file (MVP limitation)
  • Supported node types: Component, ComponentSet, Frame, Instance
  • Recommended background size: 1920x1080 (slide dimensions)

Images can be inserted using ![alt](url) format.

![Sample image](https://example.com/image.png)

Remote URLs (starting with http:// or https://) are fetched by the plugin and displayed via createImage (PNG/JPEG/GIF only).

![Local image](./images/photo.jpg)
![Absolute path](../assets/logo.png)

Local file paths (without URL scheme) are automatically detected by the CLI, read, base64 encoded, and sent to the plugin. Paths are resolved relative to the Markdown file.

Supported formats: .jpg, .jpeg, .png, .gif

Size limit: Default is 5MB. Files exceeding this are skipped with a warning.

You can specify image dimensions using Marp-compatible syntax in the alt text:

![w:400](./image.png) # Width 400px (height auto-calculated)
![h:300](./image.png) # Height 300px (width auto-calculated)
![w:400 h:300](./image.png) # Fixed size 400x300px
![w:50%](./image.png) # 50% of slide width (960px)
![w:400 Logo](./image.png) # Size specification + alt text

Behavior:

  • w: only: Height is calculated to maintain aspect ratio
  • h: only: Width is calculated to maintain aspect ratio
  • Both specified: Uses exact dimensions (may not preserve aspect ratio)
  • Percentage: Calculated based on slide width (1920px)
  • No size specified: Default max constraints apply (400x300px)

You can specify absolute x/y coordinates to place images at specific positions on the slide:

![x:100 y:200](./image.png) # Position at (100px, 200px)
![x:50% y:50%](./image.png) # Center of slide (percentage)
![w:300 x:100 y:200](./image.png) # Size + position combined
![w:300 x:100 y:200 Product](./image.png) # Size + position + alt text

Behavior:

  • When x: or y: is specified, the image is placed at absolute coordinates instead of auto-layout flow
  • If only x: is specified, y defaults to 0 (and vice versa)
  • Percentage: x: is calculated based on slide width (1920px), y: is calculated based on slide height (1080px)
  • Example: x:50% = 960px, y:50% = 540px

Use cases:

  • Overlay images on backgrounds
  • Side-by-side layouts
  • Precise logo or icon placement
  • Complex multi-image compositions

If image loading fails (file not found, network error, etc.), a placeholder is displayed. The alt text or URL is shown as a label.

Using :::figma blocks, you can embed link cards to Figma nodes in slides. For nodes in the same file, clicking jumps directly to that node.

:::figma
link=https://www.figma.com/file/xxx/name?node-id=1234-5678
:::
PropertyRequiredDescription
linkYesFigma URL (with node-id parameter)
x-Card X coordinate (auto-positioned if omitted)
y-Card Y coordinate (auto-positioned if omitted)
hideLink-Hide the clickable link label below preview (true)
text.*-Text layer overrides (see below)

You can override text content in Figma components using text.* properties. The * is replaced with the layer name (case-insensitive).

:::figma
link=https://www.figma.com/file/xxx?node-id=1234-5678
text.title=Cart Feature
text.body=Use this for cart and confirmation flows.
:::

Rich text formatting is supported within text overrides:

:::figma
link=https://www.figma.com/file/xxx?node-id=1234-5678
text.description=This is **bold** and *italic* text with a [link](https://example.com).
:::

Multiline text with bullet lists:

:::figma
link=https://www.figma.com/file/xxx?node-id=1234-5678
text.content=
- Variation A
- Variation B
- Variation C
:::

Supported formatting in text overrides:

  • Bold: **text**
  • Italic: *text*
  • Strikethrough: ~~text~~
  • Links: [text](url)
  • Bullet lists: - item
  • Blockquotes: > quote (displayed as quoted italic text)

Note: Code blocks are not supported in text overrides due to Figma text layer limitations.

:::figma
link=https://www.figma.com/file/xxx?node-id=1234-5678
x=160
y=300
:::
  • Same file: If node-id exists in the current file, the component is cloned as a preview with clickable link
  • Other file: For different files, shows a link card with URL hyperlink
  • Node not found: If the specified node-id is not found, a warning is shown and URL fallback is used
  • Text overrides: Text layers matching text.* layer names are updated with the specified content and formatting
  • https://www.figma.com/file/<fileKey>/<name>?node-id=<nodeId>
  • https://www.figma.com/design/<fileKey>/<name>?node-id=<nodeId>
  • https://figma.com/file/<fileKey>?node-id=<nodeId>

The node-id parameter supports 1234-5678, 1234:5678, or URL-encoded format 1%3A2.

GitHub Flavored Markdown table syntax is supported.

| Feature | Description |
|---------|-------------|
| Parse | Analyze Markdown |
| Convert | Convert to Figma Slides |

Alignment can also be specified:

| Left | Center | Right |
|:-----|:------:|------:|
| Text | Text | Number |

Using :::columns blocks, you can create multi-column layouts (2-4 columns).

:::columns
:::column
Left column content
:::column
Right column content
:::
PropertyDefaultDescription
gap32Gap between columns in pixels (max: 200)
widthevenColumn widths (fr, %, or px values separated by /)
:::columns
:::column
### Features
- Fast rendering
- Live preview
- Easy to use
:::column
### Benefits
- Save time
- Consistent design
- Version control friendly
:::
:::columns
:::column
**Step 1**
Planning
:::column
**Step 2**
Development
:::column
**Step 3**
Deployment
:::
:::columns
:::column
Q1: $1.2M
:::column
Q2: $1.8M
:::column
Q3: $2.1M
:::column
Q4: $2.5M
:::
:::columns gap=64
:::column
More space
:::column
Between columns
:::

Use fr (fractional units), % (percentage), or px (pixels):

:::columns width=1fr/2fr
:::column
### Sidebar (1/3)
Navigation
:::column
### Main Content (2/3)
Primary content area
:::
:::columns width=30%/70%
:::column
Sidebar
:::column
Main content
:::

Each column can contain any of the following:

  • Paragraphs with inline formatting (bold, italic, code, links)
  • Bullet lists (ordered and unordered)
  • Code blocks with syntax highlighting
  • Images (with size constraints)
  • Tables
  • Blockquotes
  • Headings (H3, H4)
  • If fewer than 2 columns are defined, content renders linearly (no columns)
  • If more than 4 columns are defined, only the first 4 are used
  • If column widths are below minimum (320px), columns stack vertically

GFM footnote syntax is supported. Footnotes are displayed at the bottom of the slide in a smaller font.

## Research Results
According to recent research[^1], this is an important finding[^2].
[^1]: Smith et al. (2024) Journal of Science
[^2]: See Appendix A for details

You can also use names instead of numbers:

This feature is useful[^note].
[^note]: Verified through usability testing
  • Footnote references in the text are displayed as [1] or [note] in square brackets (Figma Slides does not support superscript)
  • Footnote definitions are displayed at the bottom of the slide, separated by a horizontal line
  • Inline formatting like bold and italic can also be used within footnotes

You can configure transition animations between slides.

---
transition: dissolve
---

You can also specify duration:

---
transition: slide-from-right 0.5
---
---
transition:
style: slide-from-right # Animation style
duration: 0.5 # Duration (seconds) 0.01-10
curve: ease-out # Easing curve
timing:
type: after-delay # on-click or after-delay
delay: 2 # Auto-advance delay (seconds) 0-30
---

Set a global transition in the frontmatter at the beginning of the file:

---
transition:
style: dissolve
duration: 0.5
curve: ease-out
---
# Title Slide
---
## Content Slide

In this case, the dissolve transition is applied to all slides.

You can override the global setting for individual slides:

---
transition: dissolve
---
# Title
---
transition: slide-from-right
---
## This slide only slides in from the right

Use transition: none to disable transitions.

CategoryStyles
Basicnone, dissolve, smart-animate
Slide Inslide-from-left, slide-from-right, slide-from-top, slide-from-bottom
Pushpush-from-left, push-from-right, push-from-top, push-from-bottom
Move Inmove-from-left, move-from-right, move-from-top, move-from-bottom
Slide Outslide-out-to-left, slide-out-to-right, slide-out-to-top, slide-out-to-bottom
Move Outmove-out-to-left, move-out-to-right, move-out-to-top, move-out-to-bottom
CurveDescription
ease-inStart slow, accelerate
ease-outDecelerate to end
ease-in-and-outStart slow, end slow
linearConstant speed
gentleSmooth
quickFast
bouncyBouncing
slowSlow
TypeDescription
on-clickAdvance on click (default)
after-delayAuto-advance after specified seconds

Note: after-delay only works in presentation mode.

You can configure custom font families for different text elements in your slides.

---
fonts:
h1: "Roboto" # Shorthand: just family name (uses "Regular" style)
h2: "Open Sans"
body: "Source Sans Pro"
bullets: "Inter"
---

For complete control over font variants, use the full object syntax:

---
fonts:
h1:
family: "Roboto"
style: "Medium" # Base style (default: "Regular")
bold: "Bold" # Bold variant (default: "Bold")
italic: "Italic" # Italic variant (default: "Italic")
boldItalic: "Bold Italic" # Bold Italic variant
body:
family: "Source Sans Pro"
style: "Regular"
bold: "Semibold" # Custom bold variant
---
ElementDescription
h1H1 headings (title slides)
h2H2 headings (content slide titles)
h3H3 sub-headings
h4H4 sub-headings
bodyBody paragraphs
bulletsBullet list items
codeCode blocks and inline code
PropertyDescriptionDefault
familyFont family name (e.g., “Roboto”)Required
styleBase font style”Regular”
boldBold variant style name”Bold”
italicItalic variant style name”Italic”
boldItalicBold Italic variant style name”Bold Italic”

If a requested font is not available in Figma:

  1. A notification warning is displayed
  2. The plugin falls back to Inter as the default font
  3. The slide continues to render normally

You can override fonts for individual slides:

---
fonts:
h1: "Roboto"
body: "Source Sans Pro"
---
# Slides with default fonts
---
fonts:
h1: "Georgia"
body: "Times New Roman"
---
# This slide uses different fonts

Blocks enclosed in ``` are displayed as code blocks. Specifying a language enables syntax highlighting.

` ```typescript
const message: string = "Hello, World!";
console.log(message);
` ```

Supported languages: TypeScript, JavaScript, Python, Bash, JSON, CSS, HTML, XML, Go, Rust, SQL

---
# figdeck Presentation
From Markdown to Figma Slides
---
## Table of Contents
- Overview
- Feature Introduction
- Demo
- Summary
---
## Overview
figdeck is a tool that converts
Markdown files to Figma Slides.
The CLI and Figma Plugin work together.
---
## Features
- Markdown parsing
- WebSocket communication
- Automatic slide generation
---
# Thank You
Any questions?

This example generates the following 5 slides:

  1. Title slide “figdeck Presentation”
  2. Content slide “Table of Contents” (4 bullet items)
  3. Content slide “Overview” (2 paragraphs)
  4. Content slide “Features” (3 bullet items)
  5. Title slide “Thank You”
SyntaxStatusNotes
Headings (H1-H4)SupportedH1/H2 are slide titles
ParagraphsSupported
Bullet pointsSupportedBoth ordered and unordered
BoldSupported
ItalicSupported
StrikethroughSupportedGFM
Inline codeSupportedWith background color
LinksSupportedClickable
BlockquotesSupportedWith left border
Code blocksSupportedSyntax highlighting
TablesSupportedGFM, alignment supported
ImagesSupportedLocal and remote
Figma linksSupported:::figma blocks
align/valignSupportedSlide alignment settings
FootnotesSupportedGFM, displayed at slide bottom
TransitionsSupportedSlide transition animations
Custom FontsSupportedPer-element font families
Background ComponentSupportedFigma Component/Frame as background