Convert Lines to a Markdown Checklist
Turn a plain list into a clean Markdown checklist without adding checkbox syntax by hand.
Run — free
Paste one task per line and receive ready-to-use task list markup for an issue, project note, pull request, or documentation page. The converter removes empty lines, trims accidental surrounding spaces, and places an unchecked checkbox before every remaining item. Its deterministic output is easy to review, copy, store, or feed into an automated workflow reliably.
Prepare one actionable item per line
Start with ordinary text containing one task on each line. The lines can be short reminders, complete sentences, release steps, review questions, or any other items that belong in a task list. You do not need to type bullets, brackets, or Markdown symbols before submitting the text. Empty lines are allowed between groups while drafting; the converter ignores them instead of creating blank checkbox entries. It also trims spaces and tabs from the beginning and end of every retained line, which keeps copied material consistent when it comes from email, a document, or an indented note. The text inside each line is otherwise preserved, including punctuation, inline code markers, links, emphasis, and Unicode characters. For the clearest result, keep each logical task on a single line. If a description needs several paragraphs or nested details, create the checklist first and add that richer structure afterward in the destination editor. This keeps the conversion rule simple and the generated list predictable.
Understand the generated Markdown
Every non-empty line becomes a Markdown task list item in the form of a hyphen, a space, an empty pair of square brackets, another space, and the original line. Most Markdown renderers display that sequence as an unchecked checkbox. The response returns the complete markup in the markdown field and the number of generated entries in the items field. The count is useful when an integration needs to confirm how many tasks were accepted before publishing or saving the result. This capability always creates unchecked items because its purpose is to turn source lines into a new checklist, not to infer progress from wording. Existing punctuation within a line is not interpreted as status or metadata. Blank lines do not appear in the output, and different input line endings are normalized into standard newline separators. Since the algorithm uses no network service, model, random source, or clock, the same input always produces the same output. That makes the result suitable for repeatable scripts and golden-file workflows as well as interactive copying.
Paste or automate the result safely
Copy the returned Markdown into any destination that supports task list syntax, such as an issue description, pull request template, repository document, team note, or static site source file. Preview the destination before publishing if its Markdown dialect has special rules, because individual platforms may style checkboxes differently even though the underlying syntax is widely recognized. In an automated workflow, send the source text in the required text field, read the markdown value, and place that value into the destination rather than reconstructing the syntax again. The API request costs $0.002, while the browser version can perform the same deterministic conversion locally. Treat the generated markup as formatting rather than authorization: converting a line does not execute the task, notify an assignee, set a deadline, or create an issue. It simply prepares paste-ready text. If ordering matters, arrange the source lines first, because their order is retained. If grouping matters, consider adding headings around separate conversion results after they are generated, since intentionally blank source lines are removed.
What you can do with it
Prepare an issue checklist
Convert acceptance criteria or investigation steps into checkbox items ready for an issue description.
Build a review template
Turn a plain list of review questions into consistent Markdown for pull requests and release notes.
Format project notes
Transform meeting actions or planning notes into a task list without editing every line manually.
FAQ
What does it cost?
The API costs $0.002 per request. The browser version performs the same conversion locally.
What happens to blank lines?
Blank and whitespace-only lines are ignored, so they do not create empty checklist items.
Does it mark any tasks as completed?
No. Every generated item uses an unchecked checkbox so that progress can be recorded later.
Does it preserve the order of my lines?
Yes. Non-empty lines appear in exactly the same order in the generated checklist.
Can a line contain Markdown formatting?
Yes. Content within a line is preserved, so links, emphasis, inline code, and other Markdown can remain in the task text.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/str/markdown-checklist \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Review the proposal\nAssign an owner\nSet a due date"}'const res = await fetch("https://api.kit.forhosting.com/str/markdown-checklist", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Review the proposal\nAssign an owner\nSet a due date"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/markdown-checklist",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Review the proposal\nAssign an owner\nSet a due date"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/markdown-checklist", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Review the proposal\\nAssign an owner\\nSet a due date"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Review the proposal\nAssign an owner\nSet a due date"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/markdown-checklist", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"text": "Review the proposal\nAssign an owner\nSet a due date"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.markdown_checklist",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |