Blog
How the Targ Apps marketing site blog works, including MDX frontmatter, routes, RSS, and tests.
The Targ Apps blog is part of the targ-apps marketing site. Posts are authored as MDX files with validated YAML frontmatter and rendered at /blog/[slug].
Why this project hosts the blog
targ-appsis the public site at targapps.xyztarg-apps-docsis reserved for technical product documentation (Chroma, Chroma-Fs, etc.)targ-apps-page-vmaspadis a deployment variant of the same marketing site and is not the canonical blog host
Add a new post
- Create a file in
targ-apps/content/blog/your-post-slug.mdx - Add frontmatter that matches the schema below
- Write the post body in Markdown/MDX below the closing
--- - Run
npm testandnpm run buildinsidetarg-apps
Published posts are included automatically in:
/blog/blog/[slug]/blog/rss.xml/sitemap.xml- prerender output at build time
Frontmatter schema
| Field | Required | Type | Notes |
|---|---|---|---|
title | yes | string | Display title |
description | yes | string | Summary for cards, SEO, and RSS |
date | yes | string | ISO date YYYY-MM-DD |
author | yes | string | Author name |
slug | yes | string | Kebab-case URL slug |
tags | no | string[] | Defaults to [] |
draft | no | boolean | Defaults to false; drafts are excluded from the public site |
authorAvatar | no | string | Avatar image path |
readTime | no | string | Display string such as 6 min. read |
backgroundImage | no | string | Hero background image path |
coverImage | no | string | Fallback hero image when backgroundImage is omitted |
intro.heading | no | string | Optional intro heading above the MDX body |
intro.paragraphs | no | string[] | Intro paragraphs rendered above the MDX body |
Example:
---
title: Welcome to the Targ Apps Blog
description: Introducing our new blog for product updates and engineering notes.
date: 2026-08-15
author: Targ Apps
authorAvatar: /logo.svg
readTime: 4 min. read
backgroundImage: /targapps-curve.svg
slug: welcome-to-targ-apps
tags:
- announcement
- studio
intro:
heading: A home for studio stories
paragraphs:
- We build websites, mobile apps, and desktop software from Buenos Aires.
---
<Callout title="New on the site">
Subscribe via RSS at <a href="/blog/rss.xml">/blog/rss.xml</a>.
</Callout>
## What you'll find here
Your MDX content goes here.MDX components
Blog posts can use these MDX components:
<Callout title="...">...</Callout><Alert>...</Alert>
Headings rendered from ## in the MDX body populate the table of contents sidebar automatically.
Routes and feeds
| URL | Output |
|---|---|
/blog | Blog index sorted by date descending, with category sidebar filtering on desktop |
/blog/welcome-to-targ-apps | Example post page |
/blog/building-with-chroma | Example post page |
/blog/rss.xml | RSS 2.0 feed with atom:link self reference |
The main site navigation includes a Blog link, and blog pages expose an RSS alternate link in route metadata.
The blog index uses a centered hero (Latest Insights & Updates), a left sidebar of category filters derived from post tags (desktop only), and a vertical article list with title, excerpt, author, and date. Filtering is client-side: selecting a tag shows posts that include that tag; All Articles resets the filter.
Validation and tests
Frontmatter is validated with Zod in app/lib/blog/schema.ts.
Tests live in:
app/lib/blog/format.test.tsapp/lib/blog/schema.test.tsapp/lib/blog/posts.test.tsapp/lib/blog/rss.test.tsapp/lib/blog/toc.test.tsapp/lib/blog/toc.server.test.ts
Run them with:
cd targ-apps
npm testBuild and prerender
Blog routes are prerendered during npm run build. Slugs are discovered from content/blog/*.mdx at build time so dynamic post URLs are included in the static output.
See also: SEO & Indexing