A real writing editor for your Markdown site
Kobun works on top of your GitHub repo. Drafts stay out of Git until they're ready, and publishing makes one clean commit.
Free during open beta.
Focus on your writing, not on Markdown syntax
Write a post the way you'd write a doc. Headings, lists, callouts and code blocks are one keystroke away, and you can drag blocks to reorder them. When you publish, Kobun saves a normal Markdown file to your repo, frontmatter included.
Messy drafts stay out of your Git history
Kobun saves your draft as you type. Drafts stay in Kobun, not in your repo, so nothing reaches GitHub until you publish.
When you publish, Kobun makes one commit. Your Git history stays a clean list of published posts.
Your site stays the same. Your content stays yours.
Keep your framework
Astro, Next.js, Hugo, Eleventy, Jekyll or your own build script. Kobun only writes files, so your build never knows it's there.
Keep your host
Vercel, Netlify, Cloudflare or GitHub Pages. You deploy the same way you do today.
Nothing to install
No npm package and no admin route to secure. Just a GitHub App and one config file.
Leave whenever you like
Your posts are plain Markdown, JSON and YAML in your own repo. Close your Kobun account and every post stays where it is.
Fill in a form instead of writing frontmatter
Add one config file, .kobun.json or .kobun.yml, to your repo and list your collections and their fields. Kobun gives every post a form with those fields and writes the frontmatter for you, the same way every time.
{
"version": 1,
"collections": {
"posts": {
"label": "Posts",
"format": "md",
"schema": {
"title": { "type": "text", "label": "Title", "required": true },
"slug": { "type": "slug", "label": "Slug", "from": "title" },
"publishedAt": { "type": "date", "label": "Published" },
"tags": {
"type": "multi_select",
"label": "Tags",
"options": [
{ "label": "Go", "value": "go" },
{ "label": "Notes", "value": "notes" }
]
},
"body": { "type": "document", "label": "Body" }
},
"features": { "publish": true, "timestamps": { "createdAt": true, "updatedAt": true } }
}
}
}---
title: Getting started with Kobun
slug: getting-started
publishedAt: 2026-07-25
cover: /images/blog/getting-started.png
author: authors/mari
draft: false
---
Kobun stores every entry as plain Markdown in your
repo. Edit it in the browser, or open it in your own
editor — it's just a file.
## Why Git-based?
Your content gets the same review, history, and
rollback story as your code.---
import { getCollection } from 'astro:content'
const posts = (await getCollection('posts'))
.filter((post) => !post.data.draft)
.sort(
(a, b) =>
b.data.publishedAt.valueOf() -
a.data.publishedAt.valueOf(),
)
---
<ul>
{posts.map((post) => (
<li>
<a href={`/blog/${post.data.slug}`}>{post.data.title}</a>
</li>
))}
</ul>import fs from 'node:fs/promises'
import path from 'node:path'
import matter from 'gray-matter'
const dir = path.join(process.cwd(), 'content/posts')
export default async function BlogIndex() {
const files = await fs.readdir(dir)
const posts = (
await Promise.all(
files.map(async (file) => {
const raw = await fs.readFile(path.join(dir, file), 'utf8')
return matter(raw).data
}),
)
)
.filter((post) => !post.draft)
.sort((a, b) => +new Date(b.publishedAt) - +new Date(a.publishedAt))
return (
<ul>
{posts.map((post) => (
<li key={post.slug}>
<a href={`/blog/${post.slug}`}>{post.title}</a>
</li>
))}
</ul>
)
}import matter from 'gray-matter'
import type { Route } from './+types/blog'
const files = import.meta.glob('../content/posts/*.md', {
eager: true,
query: '?raw',
import: 'default',
}) as Record<string, string>
export function loader() {
return Object.values(files)
.map((raw) => matter(raw).data)
.filter((post) => !post.draft)
.sort((a, b) => +new Date(b.publishedAt) - +new Date(a.publishedAt))
}
export default function Blog({ loaderData }: Route.ComponentProps) {
return (
<ul>
{loaderData.map((post) => (
<li key={post.slug}>
<a href={`/blog/${post.slug}`}>{post.title}</a>
</li>
))}
</ul>
)
}import matter from 'gray-matter'
import { For } from 'solid-js'
import { A } from '@solidjs/router'
const files = import.meta.glob('~/content/posts/*.md', {
eager: true,
query: '?raw',
import: 'default',
}) as Record<string, string>
const posts = Object.values(files)
.map((raw) => matter(raw).data)
.filter((post) => !post.draft)
.sort((a, b) => +new Date(b.publishedAt) - +new Date(a.publishedAt))
export default function Blog() {
return (
<ul>
<For each={posts}>
{(post) => (
<li>
<A href={`/blog/${post.slug}`}>{post.title}</A>
</li>
)}
</For>
</ul>
)
}<script lang="ts">
import matter from 'gray-matter'
const files = import.meta.glob('$lib/content/posts/*.md', {
eager: true,
query: '?raw',
import: 'default',
}) as Record<string, string>
const posts = Object.values(files)
.map((raw) => matter(raw).data)
.filter((post) => !post.draft)
.sort(
(a, b) =>
+new Date(b.publishedAt) - +new Date(a.publishedAt),
)
</script>
<ul>
{#each posts as post (post.slug)}
<li>
<a href="/blog/{post.slug}">{post.title}</a>
</li>
{/each}
</ul>Pricing
Both options have the same features. The hosted version is free during the open beta.
Hosted
Sign in with GitHub and start writing. There is nothing for you to run or update.
- Free during open beta
- 3 repositories stay free after beta
- No servers to run or update
- Writing in about five minutes
Self-hosted
Run Kobun on your own Cloudflare account. You control your data and your setup.
- Runs on Cloudflare Workers and D1
- Your own GitHub App and secrets
- No limits except Cloudflare's
- Source-available (FSL-1.1-MIT)
FSL-1.1-MIT lets you use, change and self-host Kobun for free. You can't sell a competing hosted version. Each release becomes MIT-licensed two years after it ships.
What works today, and what doesn't yet
Kobun is at version 0.8.0, and I publish my own sites with it. Connect a repo with a config file and you can be writing in a few minutes.
What isn't there yet:
- Version history in the dashboard (your full Git history is on GitHub for now)
- Image uploads from the editor
- Automatic schema detection from an existing repo
- More field types
You'll find bugs. Tell me and I'll fix them.
Write your next post in Kobun
Connect a repo, add one config file, and see if you like writing here. It takes about five minutes, and it's free during the open beta.