anaksor-ocr
Sokheng · Kit
Reads Khmer and English text from documents, receipts and photos of signs, using a detector for text lines and a recogniser for each line. Suits developers who…
An n8n workflow that turns a list of topics into draft articles through your own REST API. A code check marks each draft pass or fail, and only a passing draft goes on to your publishing endpoint.
Topic list to checked drafts through a code QA gate is an n8n workflow in the Writing category, listed by Mindket. It is free. This is version 1, last updated on . Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.
Web request
It starts when a POST reaches the content-run webhook with:
A summary of the run with the drafts filed, each failure with its reasons and the estimated cost
What you need before you start.
Search, writing, alerts and publishing
Receives every outside call: research, outline, draft, alerts and publishing.
NeedsAn API at one address with the endpoints /search, /llm/complete, /alerts and /publish/doc
Checked by Mindket on 13 Nov 2026
This n8n workflow is a content pipeline skeleton. You send it a list of topics in a web request. For each topic it calls your own API to research, outline and draft an article, and then a Code node checks the draft against fixed rules. A draft that passes is filed as a draft through your publishing endpoint. A draft that fails is reported with its reasons. Seventeen nodes do the work, beside one sticky note.
Teams that run their own content or search API and want a pattern for checking model drafts with code instead of trusting the model. Skip it if you want a ready service. Every outside step is a call to an API you provide.
| Industry | Who uses it | How they use it | Example |
|---|---|---|---|
| Marketing | Content teams | Draft articles from a topic list and test them against house rules | A team sends ten topics and reads the drafts that pass. |
| Publishing | Editors | Stop drafts that lack sources or headings before an editor sees them | An editor opens only drafts with two or more source links. |
| Software | Platform engineers | Join a model, a search service and a CMS behind one set of endpoints | An engineer maps the four endpoints to services already in use. |
| Compliance | Brand reviewers | Block banned claims in code | A reviewer adds a banned phrase to the QA list. |
You need n8n, a REST API with four endpoints and some comfort with code.
Any n8n that can reach your API will run it. The caller gets a summary in the reply.
Config for a weekly runDownload saves a zip with workflow.json and Mindket’s setup notes in your downloads folder. Setup is your API’s address, four endpoints and one activation.
| Need | Detail |
|---|---|
| n8n | On n8n Cloud or on a server of your own |
| Your REST API | POST /search, POST /llm/complete, POST /alerts and POST /publish/doc |
| Endpoint | Receives | Replies with |
|---|---|---|
/search | query and recency_days | results, a list |
/llm/complete for the outline | task set to outline, and input with topic and sources | output with title and sections, and usage |
/llm/complete for the draft | task set to draft, and input with topic, title, sections and sources | output with title and body, and usage |
/alerts | channel and text, and approval on the approval message | Any reply |
/publish/doc | title, body and status set to draft | url |
workflow.json.Config and Config (errors), replace https://api.your-company.example with your API’s address.Config, set min_words, which is 120 as shipped, and auto_approve_in_test.content-run.{"topics": ["first topic", "second topic"]}.Send a list of topics, or one string of topics separated by commas, and read the summary that comes back. Add run_id to name the run. Each topic goes through research, outline, draft and the QA gate in turn. A passing draft is filed as a draft, and a failing one is posted to the failed channel with its reasons.
| To change | Where |
|---|---|
| The checks | The code in Agent 4 · QA gate (deterministic checks) |
| The minimum length | min_words in Config |
| The research window | recency_days in Agent 1 · Research (search API) |
| The channels | The channel names in three HTTP nodes |
| The cost rates | The two numbers in the QA code |
An editor sends two topics to the webhook and waits for the summary.
The reply counts the topics and the drafts filed. It lists each failure with its title and issues, such as too short or no sources section, and it adds an estimated cost. A passing draft has the address that /publish/doc returned in its log row.
If you are new. A QA gate is a check that stands between a draft and its publication. Here the check is plain code. It counts words, looks for required headings and scans for banned phrases. A model can write well and still break a rule, and code does not forget the rule.
For experts. The four agent nodes are plain HTTP Request nodes, so the models and the search sit behind your API. Loop topics runs one topic at a time and feeds each result back through Run log row. The cost line uses fixed rates.
| Node | What it does | What to know |
|---|---|---|
One item per topic | Splits the topics into items | It stops with an error when the list is empty |
Agent 4 · QA gate (deterministic checks) | Checks length, sources, banned phrases and two headings | It checks form, not truth |
Human approval (Slack) | Posts the approval message to your API | It does not wait for anyone |
Run log row | Writes one row for each topic | It leaves out run_id |
Error trigger | Starts the alert branch | Only automatic runs reach it |
The workflow is a skeleton, and several details need your attention before real use.
Human approval (Slack) only posts a message, and the draft is filed straight after as a draft. For a real approval, add a Wait node and resume it from your own toolrun_id comes out empty, because Run log row does not carry it. Add run_id: q.run_id to the object it returnsAn n8n workflow that takes a list of topics and turns each one into a draft article. It researches the topic, writes an outline,
writes the draft, and then checks the draft with plain code before anything is filed. A draft that passes goes to your
publishing endpoint as a draft. A draft that fails goes back with the reasons.
This is a skeleton, not a ready service. Every outside step is an HTTP call to a REST API that you provide, and the file names
four endpoints it expects. Read "Before you start" first.
workflow.json: the workflow as n8n exports it, 18 nodes, one of them a sticky note. It holds no credential, and no HTTP nodeREADME.md: these notes.POST /search takes {"query": "<topic>", "recency_days": 90} and replies with {"results": [...]}.POST /llm/complete takes {"task": "outline", "input": {"topic", "sources"}} and replies with{"output": {"title", "sections"}, "usage": {"input_tokens", "output_tokens"}}. The same endpoint takes{"task": "draft", "input": {"topic", "title", "sections", "sources"}} and replies with {"output": {"title", "body"}, "usage": {...}}.POST /alerts takes {"channel", "text"}, plus an approval field on the approval message. Any reply is fine.POST /publish/doc takes {"title", "body", "status": "draft"} and replies with {"url"}.workflow.json.Config, replace the base value, https://api.your-company.example, with your API's address. Do the same inConfig (errors).Config, set min_words, which is 120 as shipped, and auto_approve_in_test.Webhook / weekly schedule: topics. Its path is content-run.{"topics": ["first topic", "second topic"]}. A string ofrun_id if you want your own run name.Webhook / weekly schedule: topics receives the request. Config adds the settings, and One item per topic is a Code nodeLoop topics takes one topic at a time. When none are left it sends everything to Run summary (respond).Agent 1 · Research (search API) posts the topic to /search with a 90 day window.Agent 2 · Outline (LLM) posts the topic and the search results to /llm/complete and gets a title and sections.Agent 3 · Draft (LLM) posts the outline and the sources to the same endpoint and gets a title and a body.Agent 4 · QA gate (deterministic checks) is a Code node. It marks the draft as failed when any of these is true:min_wordsSources: lineguaranteed, risk-free, 100% or best in the world## Why it matters now or ## What to do this quarterIt also adds up the tokens from the outline and the draft, and estimates a cost.
QA passed? sends a passing draft to Human approval (Slack), which posts a message to /alerts in the channel#content-approvals. The next node, Publish as draft (Google Docs / CMS), posts the draft to /publish/doc at once.Send back with reasons (no publish), which posts the reasons to /alerts in the channel#content-qa-failed.Run log row writes one row for the topic: title, word count, pass or fail, issues, the published address if there is one,Run summary (respond) counts the topics, the drafts filed and the failures, adds the costs, and the webhook returns thatThe error branch is separate: Error trigger runs Config (errors) and Alert ops, which posts "Content pipeline failed" with
the error message to /alerts in the channel #ops-alerts.
Agent 4 · QA gate (deterministic checks) code holds the word count, the banned phrases, the two requiredrecency_days in Agent 1 · Research (search API).#content-approvals, #content-qa-failed and #ops-alerts are plain text in three nodes.Human approval (Slack) only posts a message, then the draft is filed straight away as a draft.approval field of that message reads auto-approved when auto_approve_in_test is on and awaiting human when it isrun_id comes out empty, because Run log row does not carry it. Add run_id: q.run_id to the object it returns.NOTICE.md 716 B README.md 7 KB workflow.json 14 KB
Sokheng · Kit
Reads Khmer and English text from documents, receipts and photos of signs, using a detector for text lines and a recogniser for each line. Suits developers who…
Qwen · Kit
Qwen2.5-7B-Instruct as GGUF files in eight quantization sizes, to chat with locally through llama.cpp. For people who want a capable 7.6B model on their own co…
ACE-Step · Kit
Generates music from text with a 4B diffusion decoder, 50 steps and guidance control, aiming for higher audio quality than the base. For creators with a GPU of…
vennify · Kit
Rewrites English text with fewer grammar mistakes, using a T5 model trained on the JFLEG dataset. Made by vennify for writers, students and developers who want…
tencent · Kit
Translates between 33 languages on your own device with a 1.8B model squeezed to 1.25 bits, about 440 MB as GGUF files for llama.cpp. For developers adding off…
summerAIO · Kit
Summarizes, answers questions about and continues book-length text with a fine-tuned 27B model that uses Gated DeltaNet layers, in English and Japanese. For pe…