How to form-driven yaml frontmatter generator
- Step 1Open the form and choose an input mode — The frontmatter fields appear under the input panel. Use Paste text to drop the post body in, or Upload file for a single
.md/.txt. The body is whatever you put here; there is no separate body box. - Step 2Type the Title — Enter the post title in plain text. You can include colons, quotes, or hashes — the serializer quotes the value when needed so you never think about YAML escaping.
- Step 3Enter the Date as ISO text — Type
YYYY-MM-DD(e.g.2026-06-13). The field is free text with no auto-fill, so it is blank until you type. Date-like values are single-quoted in the output automatically. - Step 4Fill Slug and Description — Slug is the URL fragment; Description is your SEO summary. Both are optional — leave either blank and it is omitted from the block. No need to wrap descriptions in quotes.
- Step 5List your Tags — Type tags comma-separated, e.g.
editorial, q2, how-to. They become a clean YAML array. Spacing and trailing commas are tidied for you. - Step 6Set Draft and run — Tick Draft for work-in-progress posts; leave it for published. Run, check the preview, and download the
.md. The block is prepended above your body with fields in the fixed order.
What the form does so you don't touch YAML
Each form control mapped to the YAML rule it handles on your behalf. The serializer (js-yaml) makes the quoting and indentation decisions — you only type values.
| You type | YAML rule it would normally require | What the tool does |
|---|---|---|
A title with a colon: Recap: Q2 | Must wrap the whole value in quotes | Auto single-quotes: title: 'Recap: Q2' |
A date 2026-06-13 | Bare date can be parsed as a date type, not a string | Single-quotes it: date: '2026-06-13' |
Tags a, b, c | Must indent each item under tags: with - | Builds the block sequence for you |
A description with # | Leading/embedded # can read as a comment | Quotes the value when ambiguous |
| Nothing in Slug | An empty slug: key is still valid but noisy | Omits the key entirely |
| Leaving Draft unticked | Authors forget the publish flag | Always writes draft: false |
Field reference for the content team
A one-screen cheat sheet you can paste into your team docs. There are exactly these six fields — no others, and no custom-field entry.
| Field | Required by the tool? | Typical value |
|---|---|---|
| Title | Optional | Plain post title |
| Date | Optional | 2026-06-13 (ISO) |
| Slug | Optional | my-post-title |
| Description | Optional | One-sentence SEO summary |
| Tags | Optional | onboarding, q2, how-to |
| Draft | Always written | Checked = true, unchecked = false |
Cookbook
Examples written from a content-ops angle: what an author types, and the block that lands in the file. Field order is always title → date → slug → description → tags → draft.
The author never sees raw YAML
A non-technical writer fills five fields and ticks nothing. The tool produces a correctly indented block they could not have hand-written reliably.
Form: Title = Onboarding Checklist for New Hires Date = 2026-06-13 Slug = onboarding-checklist Description = Everything a new hire needs in week one Tags = onboarding, hr, process Draft = (unchecked) Output block: --- title: Onboarding Checklist for New Hires date: '2026-06-13' slug: onboarding-checklist description: Everything a new hire needs in week one tags: - onboarding - hr - process draft: false ---
Colon in the title, handled silently
The classic YAML trap. The author types a natural title with a colon; the tool quotes it so the build does not fail.
Form: Title = Q2 Review: What Worked Output: --- title: 'Q2 Review: What Worked' draft: false ---
Messy tag input is cleaned
Authors paste tag lists from spreadsheets with stray spaces and trailing commas. The split-trim-filter logic normalizes them.
Form: Tags = editorial , q2 , , how-to, Output: --- tags: - editorial - q2 - how-to draft: false ---
Minimal block for a stub
A placeholder article only needs a title and a draft flag. Blank fields stay out of the block, keeping it tidy.
Form: Title = TBD: Pricing Explainer, Draft = checked Output: --- title: 'TBD: Pricing Explainer' draft: true ---
Standardizing imported posts
Content migrated from an old CMS carries an inconsistent block. Running the form replaces it with your house-style fields in a fixed order.
Paste (imported body):
---
Title: legacy
author: jane
---
# Heading
Form: Title = Standardized Title, Date = 2026-06-13,
Tags = migrated, cms
Output:
---
title: Standardized Title
date: '2026-06-13'
tags:
- migrated
- cms
draft: false
---
# Heading
(note: the old `author: jane` key is gone — re-add it manually)Edge cases and what actually happens
Author expects to save form values for reuse
Not persistedThe form does not store presets or remember field values between sessions — each run starts blank. For a repeatable house template, keep a reference block in your team docs and re-type or paste the standard tag list each time.
Existing keys like `author` or `category` are lost
ReplacedWhen the input already has a frontmatter block, the whole block is stripped and rebuilt from the six form fields. Any key not in those six (author, category, canonical, etc.) is discarded. Copy them out before running and re-add them to the downloaded block.
`draft: false` shows up on a finished post
By designDraft defaults to false and is always written. If your team's house style forbids a draft key on published posts, the one-line fix is to delete it after download. Most generators ignore draft: false and publish normally.
Wanting separate `categories` and `tags`
Single fieldThere is only a Tags field. The tool cannot produce a separate categories key. Put both kinds of label into Tags, or add a categories: key by hand to the downloaded block if your SSG distinguishes them.
Date typed in a local format
Written verbatimThe Date field has no validation. 13/06/2026 or June 13 are written exactly as typed. Coach authors to use ISO YYYY-MM-DD so the output is portable across Jekyll, Hugo, and Astro.
Blank form, run anyway
ExpectedRunning with every text field empty still produces a valid block: just ---, draft: false, ---, then the body. It is harmless but pointless — fill at least Title and Date.
Multi-language / i18n metadata
Not a fieldThere is no language or translation field. Add i18n keys (lang, translationKey) manually after running, or rely on your SSG's directory-based i18n convention.
Pasting an entire site export by mistake
Tier limitFree tier stops at 1 MB / 500,000 characters per run. A single article never approaches this; a whole-folder paste will. Process one post at a time, or upgrade to Pro (10 MB / 5,000,000 chars) for very large single documents.
Frequently asked questions
Do I need to know YAML to use this?
No — that is the point. You fill labelled fields and the tool serializes valid YAML with correct indentation and quoting. You never type a ---, a - for a list item, or a quote mark. The js-yaml serializer makes those decisions, including quoting any value (like a title with a colon) that would otherwise break a parser.
Can I save my form values as a template?
No. The form does not persist values or presets between sessions — it resets each time. Keep a reference block of your team's standard fields in your docs, and re-enter or paste the common values (like a fixed tag set) on each run.
How do I handle categories versus tags?
There is a single Tags field, so the tool can only emit tags. If your SSG distinguishes categories from tags, put both labels in the Tags field, or add a categories: key manually to the downloaded block. The form has no separate categories control.
What happens to fields I leave blank?
Each blank text field (title, date, slug, description, tags) is simply omitted from the output. The only field always written is draft, because its checkbox defaults to false. So a sparse form produces a sparse, clean block.
Why is the field order always the same?
The engine assembles the object in a fixed sequence — title, date, slug, description, tags, draft — and js-yaml serializes it in that insertion order. It does not matter which field you fill first; the output is always in this order, which is handy for consistent diffs across a content repo.
Will it mess up a description that has quotes or colons?
No. The serializer quotes the value when it contains YAML-special characters. Recap: the good and bad becomes description: 'Recap: the good and bad'. You type natural text; the quoting is automatic.
Can I add an author or canonical URL field?
Not through the form — it has exactly six fields and no custom-field section. Add author, canonical, or any other key by hand to the downloaded block. If you import a post that already has those keys, note they are stripped when the block is rebuilt, so copy them first.
Does it auto-insert today's date?
No. The Date field starts empty and is only written if you type a value. There is no auto-fill. Enter 2026-06-13-style ISO text yourself.
Is the output YAML or TOML?
Always YAML, delimited by ---. The tool never emits TOML (+++) or JSON frontmatter. If your repo uses TOML, you will need to convert the downloaded block manually.
Can a whole team use this without breaking builds?
Yes — that is the core benefit. Because authors never hand-type YAML, the indentation and quoting mistakes that fail builds are eliminated. Pair it with md-lint to catch body-level Markdown issues before publishing.
Does it validate any of the values I type?
No. None of the fields are validated — Title, Date, Slug, and Description are written exactly as typed, and Tags are only split, trimmed, and emptied. The only transformation is YAML quoting applied by the serializer when a value contains special characters. Garbage in, garbage out, so double-check the date format and slug yourself.
Which other tools help my content pipeline?
Add a contents list with md-toc-generator, normalize spacing and wrapping with md-prettifier, strip accidental API keys before publishing with md-secret-redactor, and render a preview with md-to-html.
Privacy first
All Markdown processing runs locally in your browser using JavaScript. No file is ever uploaded to JAD Apps servers — only metadata counters are saved for signed-in dashboard stats.