Codapult includes two content systems — a blog and a help center — both powered by MDX files on disk. No CMS or database required; just write Markdown with optional JSX components.
After purchase, replace all
content/blog/andcontent/docs/files with your own product's content.
MDX Blog
File Location
Blog posts live in content/blog/ as .mdx files.
Frontmatter
Every post starts with YAML frontmatter:
---
title: Launching Our API v2
description: A faster, more reliable API with breaking change migration guide.
date: 2026-03-15
author: Jane Doe
tags: [api, release]
image: /images/blog/api-v2.png
published: true
---
Your markdown content here...
| Field | Required | Description |
| ------------- | -------- | --------------------------------------- |
| title | Yes | Post title |
| description | Yes | Short summary for SEO and listing cards |
| date | Yes | Publication date (YYYY-MM-DD) |
| author | Yes | Author name |
| tags | No | Array of tags for filtering |
| image | No | Cover image path |
| published | No | Set to false to hide from listings |
Internationalization
Blog posts support per-locale translations using a filename convention:
| File | Locale |
| ---------------- | ----------------- |
| my-post.mdx | Default (English) |
| my-post.ru.mdx | Russian |
| my-post.de.mdx | German |
If a translation is unavailable for the current locale, the default-locale version is shown.
Utilities
The src/lib/blog/ module provides server-side functions:
| Function | Description |
| ----------------------------------- | ------------------------------------------ |
| getAllPosts(locale?) | List all published posts (newest first) |
| getPostBySlug(slug, locale?) | Get a single post with full MDX content |
| getAllTags(locale?) | Get all unique tags |
| getPostsByTag(tag, locale?) | Filter posts by tag |
| getPostsByAuthor(author, locale?) | Filter posts by author |
| getAllAuthors(locale?) | List all authors with post counts |
| getAllSlugs() | Get all post slugs (for static generation) |
Components
| Component | Description |
| -------------- | ------------------------------------------------------ |
| BlogSearch | Client-side search across post titles and descriptions |
| TagCloud | Tag list with post counts, links to filtered views |
| LocaleSwitch | Language switcher for translated posts |
| MdxContent | Renders MDX content with custom component mappings |
RSS Feed
An RSS feed is automatically generated at /rss.xml from published blog posts.
Help Center / Documentation
File Location
Documentation articles live in content/docs/<category>/<slug>.mdx, organized into category folders.
Frontmatter
---
title: Getting Started
description: Install and configure the app in under 5 minutes.
category: getting-started
order: 1
published: true
---
Your documentation content here...
| Field | Required | Description |
| ------------- | -------- | ----------------------------------------------- |
| title | Yes | Article title |
| description | Yes | Short summary for SEO and navigation |
| category | Yes | Folder name (e.g. getting-started, billing) |
| order | Yes | Sort position within the category |
| published | No | Set to false to hide from navigation |
Auto-Generated Navigation
The help center builds its sidebar navigation automatically from the file structure:
- Categories are derived from folder names
- Articles are sorted by
orderwithin each category - Category order is determined by the lowest
ordervalue among its articles
No configuration file is needed — add a folder and an MDX file, and it appears in the sidebar.
Full-Text Search
The searchDocs(query) function searches across article titles, descriptions, and content:
import { searchDocs } from '@/lib/docs';
const results = searchDocs('authentication');
// [{ title, description, category, slug, order, published }, ...]
The HelpDocSearch component provides a ready-made search UI with instant results.
Utilities
| Function | Description |
| ------------------------------- | ---------------------------------------------------------- |
| getDocCategories() | List all categories with their articles |
| getDocArticle(category, slug) | Get a single article with MDX content |
| getAllDocSlugs() | Get all { category, slug } pairs (for static generation) |
| searchDocs(query) | Full-text search across all articles |
Adding Content
New Blog Post
Create a file in content/blog/:
touch content/blog/my-new-post.mdx
Add frontmatter and content. The post appears on the blog page after a dev server reload (or production rebuild).
New Documentation Article
Create a file in content/docs/<category>/:
mkdir -p content/docs/integrations
touch content/docs/integrations/webhooks.mdx
Add frontmatter with the category matching the folder name and an order value. The article appears in the help center sidebar automatically.
New Documentation Category
Simply create a new folder under content/docs/ and add at least one .mdx file. The category name in the sidebar is derived from the folder name (e.g. getting-started → "Getting Started").