Convert YAML & Frontmatter to Markdown
yaml to md with the input deciding the treatment: a config or manifest is parsed by js-yaml and re-rendered as nested bullet lists with bolded keys, while a file that opens with a --- frontmatter fence keeps that block verbatim and passes the Markdown body through untouched. Everything runs in a Web Worker on your own device — no upload, no signup.Processing happens 100% in your browser — nothing is uploaded.
How to convert YAML to Markdown
- Provide the YAML: drop a .yaml or .yml file onto the dropzone, or paste the document straight into the editor.
- Local processing: js-yaml parses the stream in a Web Worker, frontmatter is detected and preserved, and data documents are rendered as nested bullet lists.
- Copy or download: copy the Markdown to your clipboard or save it as a .md file for a runbook, a README or an Obsidian vault.
Why Convert YAML to Markdown with MD Convert?
Frontmatter preserved, not flattened
A Jekyll, Hugo or Obsidian note is detected by its opening --- fence and non-empty body: the YAML header is emitted verbatim between its fences and the Markdown after it is passed through unchanged, so the file stays a valid post. The header is test-parsed first, so a document that merely starts with a horizontal rule is not mistaken for frontmatter.
Hierarchy survives at two spaces per level
Mappings become `- **key**: value` bullets, and a mapping or sequence value becomes an indented block beneath its key. Two spaces per level is what CommonMark requires for a nested list item, so a deep Kubernetes or Ansible tree stays both readable and valid.
Multi-document streams handled per document
loadAll reads every document in a --- separated stream, and each one is converted independently and joined with a thematic break that mirrors the source marker. A warning reports the document count, so a manifest that unexpectedly holds one resource instead of five is immediately visible.
Timestamps and nulls rendered faithfully
js-yaml resolves the YAML timestamp type to a real Date; stringified naively that becomes a locale-specific string that no longer round-trips, so dates are emitted as ISO 8601. An explicit null is emitted as inline code rather than as nothing, keeping a key that exists with no value distinct from a key that was absent.
YAML to Markdown: Before and After
A data document becomes an indented bullet list with bolded keys: two spaces per nesting level, sequences as bullets in source order. The structure survives, so the reader can still see which key sits under which section.
service:
name: checkout-api
replicas: 3
ports:
- 8080
- 9090
healthcheck:
path: /healthz
timeout: 2s- **service**:
- **name**: checkout-api
- **replicas**: 3
- **ports**:
- 8080
- 9090
- **healthcheck**:
- **path**: /healthz
- **timeout**: 2sUnderstanding the YAML Format: YAML 1.2.2
- Format
- YAML Ain't Markup Language
- Specification
- YAML 1.2.2
- Media type
application/yaml- Parser used
- js-yaml
Technical Specifications & YAML Hierarchy Rules
- Verbatim Frontmatter Preservation: Files starting and ending with `---` fences and followed by Markdown body content preserve their YAML header byte-for-byte; candidate headers are test-parsed to prevent horizontal rules from false triggering.
- Hierarchical CommonMark Indentation: Mappings render as `- **key**: value` bullets; nested structures indent by exactly two spaces per level, preserving Kubernetes, Ansible, and Docker Compose resource hierarchies.
- Multi-Document Stream Processing: Uses `js-yaml.loadAll` to parse multi-resource streams separated by `---` independently, joining converted documents with thematic Markdown breaks.
- Anchor Expansion & Lost Comments: Anchors (`&`) and aliases (`*`) expand inline at each use site; comments (`#`) reside in source text rather than the parsed data model and are discarded.
- Type Fidelity & Timestamps: Timestamps serialize to standard ISO 8601 strings rather than locale-dependent dates; explicit `null` values render as inline `null` code to distinguish them from absent keys.
Developer Alternative: CLI (yq) & Python (PyYAML) Extraction
For batch pipelines or server-side automation, yq and PyYAML produce the same kind of Markdown outside the browser.
# Format YAML mappings into clean Markdown list items using yq
yq -r '.. | select(has("name")) | "- **" + .name + "**: " + (.replicas // "")' manifest.yaml# Programmatic multi-document YAML conversion using PyYAML
# requires: pip install pyyaml
import yaml
with open("config.yaml", "r", encoding="utf-8") as f:
# safe_load_all handles multi-document streams safely
documents = list(yaml.safe_load_all(f))
print(f"Parsed {len(documents)} document(s) for Markdown generation.")How You Can Verify the Privacy Claim
Zero server upload
Conversion runs inside your browser tab. Open DevTools, switch to the Network panel, and convert a file: for every format except URL to Markdown you will see no request carrying your document — because there is no endpoint to send it to.
Off the main thread
Heavy parsing is dispatched to a Web Worker, so a 500-page PDF or a large spreadsheet never freezes the interface. Everything is plain JavaScript — no native plugin, no WebAssembly toolchain, nothing to install.
Nothing to sign up for
No login, no quota, no paywall, and no tracking tied to your files. Analytics are cookieless and aggregate only. Read the privacy policy for the full data-flow breakdown, including the one proxied exception.
The parsers doing the work
No proprietary black box: each format is handled by a widely audited open-source library, running client-side at the version pinned in our lockfile.
- js-yaml (YAML 1.2 parser & stream loader)YAML parsing
YAML to Markdown — FAQ
Does it preserve Jekyll or Hugo frontmatter?
Yes. If the file opens with a --- fence, closes it, and has content after the closing fence, the YAML header is preserved verbatim and the Markdown body is passed through completely unchanged. The file remains a valid Jekyll, Hugo or Obsidian note. A file that is nothing but a fenced YAML document has no body, so it is treated as data and rendered as bullets instead.
What happens to comments in my YAML file?
They are lost, and no parser-based converter can do otherwise. A YAML parser returns the data model, and # comments are not part of it — they live only in the source text. If the comments were the documentation you wanted to keep, convert the file as plain text rather than as YAML.
How are anchors and aliases handled?
They are resolved during the parse, so the output shows the fully expanded values at each use site. If your file defines &defaults and merges it into three services with <<: *defaults, all three services show those values written out. The anchor itself no longer exists by the time rendering starts.
Can it convert a multi-document Kubernetes manifest?
Yes. loadAll reads every document in the stream, each is converted separately, and the results are joined with a thematic break that mirrors the --- separator in the source. A warning tells you how many documents were found so you can confirm nothing was missed.