Feature · Deliver
Approved articles land in your repository as files with draft: true.
Approving an article in seodraft commits it to your blog's repository, at the path you configured, in the format your CMS reads. The draft flag is written on every delivery and nothing in your repository is ever deleted, so what arrives is a file waiting where you already work. The card below is the destination this site's own blog uses and the last draft it received.
7 days free, no card needed. Then $5/month if you subscribe.
What is a git-based CMS?
A git-based CMS keeps your posts as files in a git repository, so an article is a Markdown file at a path with a frontmatter block on top. Keystatic, Astro content collections, Hugo and Docusaurus all work that way; they differ in the key names and the extension, and the mechanism underneath is the same.
That is why seodraft has no CMS adapters. A destination is five answers — repository, branch, path template, body format and the key each canonical field maps to — and writing a post means committing one file through the GitHub Contents API.
What ships
- Five answers
- A destination is a repository, a branch, a path template, a body format and a frontmatter mapping, saved once per workspace.
- Two starting points
- Keystatic arrives filled in; any other git-based CMS starts blank and you type the five answers yourself.
- The draft flag, forced
- Every delivery writes draft: true over the article's own flag, whatever key your destination maps it to, with no option to turn it off.
- Markdoc headings
- For .mdoc files the writer's `## Heading {#id}` becomes `{% #id %}`, which is the spelling Markdoc turns into an id attribute.
- Safe re-delivery
- Writing the same path again goes through the file's blob SHA, so a second delivery updates the file instead of adding one.
- A slug that moved
- The new path is written, the old file is left where it is, and previousPath names it so you can delete it yourself.
A real delivery
- Repository
- ch0rch/seodraft-app · branch main
- Preset
- Keystatic · body format .mdoc
- Path template
- content/blog/{locale}/{slug}.mdoc
- File written
- content/blog/es/modelo-ia-respete-voz-marca.mdoc
- Commit message
- seodraft: draft "Cómo lograr que un modelo de IA respete la voz de mi marca"
- Frontmatter
- draft: true, over the article's false
Frontmatter mapping
- title → title
- description → description
- date → publishedAt
- updatedDate → updatedAt
- tags → tags
- draft → draft
- tldr → tldr
- faqs → faqs
- image → nothing
- translationKey → translationKey
How a draft reaches your repository
A draft reaches your repository in three steps, and the last one happens inside your own CMS.
- 1
You approve the article. approve_post checks the last rules run, marks the article ready and delivers it in the same call.
- 2
seodraft commits one file. It renames the frontmatter to your keys, drops the image slots nobody filled, forces draft: true and writes the file on your branch.
- 3
You finish it and publish. You upload the images the article asked for, fix what you want and publish from your CMS. There is no publish tool here.
What it costs
Delivery uses no paid data and is part of the $5/month plan. The credential is yours: a fine-grained GitHub token limited to that one repository, with Contents set to Read and write, encrypted at rest like the DataForSEO pair.
Questions about delivery
Short answers on publishing, on CMSes other than Keystatic, and on delivering the same article twice.
- Does seodraft publish the article?
- It writes draft: true on every delivery, over whatever the article's own flag says and whatever key your destination maps it to, and there is no setting that turns it off. Publishing is an act you perform in your CMS.
- What if my blog is not Keystatic?
- Start from the blank destination and fill the five answers yourself: repository, branch, path template, body format, and the key each canonical field maps to. Astro content collections, Hugo and Docusaurus are the same mechanism with other key names.
- What happens if I deliver the same article twice?
- The same path is written again through the file's blob SHA, so the second delivery updates that file. If the slug changed in between, the new path is written and previousPath names the old file, which stays in your repository until you remove it.
Related
- Editor · Where you read the draft before you approve it.
- Editorial calendar · The queue the article came from.
- Pricing · One plan, $5/month.