Building an operational technology blog series (1): Content modeling and information structure
Content model, frontmatter policy, and series structure design method for long-term operation of a file-based technology blog
Series: 운영형 기술 블로그 구축 시리즈
총 3편 구성. 현재 1편을 보고 있습니다.
Introduction
When posting a blog or two, any structure doesn't really matter. However, when the number of articles increases to 20 or 50, the story changes. When problems such as overlapping tags, inconsistent title rules, missing internal links, and twisted series order accumulate, both the reader experience and operational efficiency deteriorate.
This first part is the starting point of the series and covers how to first fix the content model and information structure.
Based on version
- Node.js 20 LTS
- Next.js 16.1.x
- React 19.2.x
- next-mdx-remote 6.x
- Tailwind CSS 4.x
Problem definition
Structural problems frequently encountered during the operational phase are as follows.
- It is the same topic, but the tag notation (
Next.js,nextjs,Nextjs) is different. - Although it is a series article, there is no connection to the previous/next article, which increases the bounce rate.
- Automation script is broken because the frontmatter field is different for each post.
- Manually repeat SEO/cover/category settings when publishing a new post
The key is “making sure order is maintained even when the writing piles up” rather than “writing.”
Concept explanation
Minimum content model unit
| Category | Required fields | Select field | Purpose |
|---|---|---|---|
| basic meta | title, description, date, tags | cover, coverPrompt | List/Details/Shared Consistency |
| series meta | series, seriesOrder | seriesTotal, seriesSlug | Sequence/Connection Automation |
| SEO extensions | seoTitleA/B, seoDescriptionA/B | canonical | Search performance experiment |
Naming/Tag Policy
- Tags are fixed in lowercase letters or a designation agreed upon by the team.
- The series uses
(n)in the title to ensure order recognition. - Secure URL stability by fixing slugs based on English/numbers.
Code example
Example 1: Series frontmatter type definition
export type SeriesFrontmatter = {
title: string;
description: string;
date: string;
tags: string[];
cover?: string;
coverPrompt?: string;
series?: string;
seriesOrder?: number;
seriesTotal?: number;
};
export function isSeriesPost(post: SeriesFrontmatter) {
return Boolean(post.series && typeof post.seriesOrder === "number");
}
Example 2: Sort utility for posts in the same series
type PostSummary = {
slug: string;
title: string;
series?: string;
seriesOrder?: number;
};
export function sortSeries(posts: PostSummary[], seriesName: string) {
return posts
.filter((post) => post.series === seriesName)
.sort((a, b) => (a.seriesOrder ?? 999) - (b.seriesOrder ?? 999));
}
Architecture Description
The key to this structure is to treat series information as “metadata” rather than “body text.” Only by managing metadata can you consistently link to list/detail/SEO output.
Cleanup
The first step in running a series is not a writing habit but modeling rules. Fixing the three things below will make future automation easier.
- Fix the frontmatter field set first.
- Manage the series order field as meta.
- Template internal links (previous/next/read together).
In the next two parts, we design the Google/Naver/Daum search indexing pipeline based on this model.
Reference link
- Next.js Metadata API
- Next.js Sitemap 파일 생성
- Google Search Central - SEO Starter Guide
- 블로그: MDX 콘텐츠 파이프라인
Series navigation
- Previous post: None (starter of this series)
- Next post: 운영형 기술 블로그 구축 시리즈 (2): 검색 인덱싱 파이프라인