Publish a blog
Enable the built-in blog with one content switch and flat post and author files.
Set blog: true in content.config.ts. That is the only blog feature switch: it creates the blog and authors collections, keeps the blog routes, and lets the site navigation detect that the blog exists.
import { defineGinkoDocsConfig } from "@lupinum/ginko-docs/content";
export default defineGinkoDocsConfig({
site: {
name: "Acme Docs",
description: "Documentation for Acme.",
url: "https://docs.example.com",
},
locales: ["en", "de"],
blog: true,
});Do not add a second blog flag to app.config.ts or create duplicate blog routes. Setting blog: false removes the blog collections and the layer's blog pages; automatic navigation follows the resulting router.
Add an author
Keep author records directly in each locale's authors directory:
{
"slug": "acme-team",
"name": "Acme Docs Team",
"role": "Documentation engineering",
"bio": "The team maintains Acme's product documentation.",
"avatar": "/authors/acme-team.png",
"links": [{ "label": "GitHub", "href": "https://github.com/acme" }]
}slug, name, role, bio, and avatar are required. links is optional. Add a matching file at content/de/authors/acme-team.json for German author copy.
Add a post
Place posts directly under 2.blog; the filename becomes the translated article slug:
---
title: Acme 2 is available
description: What changed in Acme 2 and how to upgrade.
badge: Release
date: 2026-07-21
readingTime: 4 min read
author: authors/acme-team
image: /blog/acme-2.png
---
Start with the change readers need to understand.
## Upgrade requirements
Describe the required work here.The post schema requires title, description, date, readingTime, and an author reference. badge and the listing image are optional. The author reference uses the data-collection path without a file extension.
For German, create the paired file at content/de/2.blog/1.acme-2-verfuegbar.md. Keep the numeric position aligned with the English post so locale switching, canonical metadata, and alternate links refer to the same article.
The layer publishes the blog index at /blog, sorts up to 50 posts by date in descending order, populates author data, and renders each article at its content route.
Subscribe by feed
Each locale serves an RSS 2.0 feed at its blog root: /blog/rss.xml for English and /de/blog/rss.xml for German. The feed carries the newest 50 posts with absolute links, publication dates, and author names, and the blog pages announce it through a rel="alternate" link so readers and crawlers discover it automatically. Both feeds are prerendered into the static build; with blog: false the routes disappear along with the blog pages.