Community라이팅 & 에디팅github.com

timerise-ai/help-center-markdown

Agent Skill: build a markdown-backed help center — category folders of frontmatter articles, static landing/category/tag/article pages, ranked client-side search, tags with slug identity, locale fallback with hreflang, JSON-LD and sitemap, CI content validator — in Next.js App Router, no CMS

help-center-markdown란 무엇인가요?

help-center-markdown is a Claude Code agent skill that agent Skill: build a markdown-backed help center — category folders of frontmatter articles, static landing/category/tag/article pages, ranked client-side search, tags with slug identity, locale fallback with hreflang, JSON-LD and sitemap, CI content validator — in Next.js App Router, no CMS.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add timerise-ai/help-center-markdown

Installed? Explore more 라이팅 & 에디팅 skills: steipete/notion, affaan-m/seo, affaan-m/brand-voice · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Help Center — markdown articles, search, i18n

A help center is a small static site with one hard requirement: every article must be reachable — from the sidebar, from search, from a translated locale that does not have it yet. Written by the engineer who has shipped this module; the earlier implementation was a marketing-site help center. The module below holds that requirement as verified properties: the sidebar shows every article of every category, search ranks a query however it is typed, related links resolve or the validator fails the build. The loader, search and tag suites cover each; the record is in references/provenance.md.

When to use

Building or extending a help center, docs section or knowledge base whose articles are markdown files in the repository, on Next.js App Router, with or without multiple locales.

When NOT to use

  • A blog. Dated, authored posts with covers and localized slugs are a different content model; keep the host's blog module.
  • Docs generated from code (OpenAPI, TypeDoc) — use their generators and link to the output.
  • A CMS-backed help site with editors publishing at runtime — the index contract still applies, but the loader, static params and validation change; see the CMS note in extensions.md.
  • Marketing pages that happen to be markdown. Reuse the host's renderer; this module is the navigation, search and locale model around many articles.

Architecture

content/help/<[locale]/><category>/<slug>.md
        │  gray-matter + normalisation
        ▼
getHelpIndex(locale)  ── React cache(): one parse per request ──┐
  categories · articles (sorted) · byKey · tags · byTag · skipped│
        │                                                        │
        ├─► pages: landing / category / tag / article ── metadata, JSON-LD, canonical/hreflang
        ├─► HelpShell ── toSummary → nav tree (sidebar + drawer)
        │             ── toSearchDoc → HelpSearch (client, tokenised prefix search)
        ├─► helpSitemapEntries()
        └─► validate:help (CI) ── unresolved related, order ties, bad dates, bad slugs, tag drift

Everything reads from the index. Nothing else touches the filesystem.

Critical facts

  1. The filesystem is the schema. Folder = category, filename = slug, and frontmatter is metadata only. slug/category in frontmatter are validated against the path, never used.
  2. Only summaries cross to the client. toSummary/toSearchDoc strip the body; passing HelpArticle to a client component ships the whole corpus in every page.
  3. An untranslated page is a duplicate. It renders from the default locale, keeps its place in navigation, shows a notice, canonicalises to the default-locale URL, and is absent from hreflang and the sitemap.
  4. The runtime forgives; CI does not. Bad references are dropped, missing orders sort last — and validate:help fails the build for the author.
  5. Search is client-side by design. ~1 KB per article, already in the page for navigation, results on the first keystroke. Body search is an extension.

Hard rules

Never cap a collapsible list's height. A max-h-* + overflow-hidden pair clips whatever does not fit and reports nothing. Use hidden or a real collapsible primitive, so a list renders every link or none.

Never sort by order alone. Ties fall through to readdir order, which differs between filesystems. Break ties by title, then slug.

Never resolve related without validating it. A dropped reference is invisible on the page; the validator is the only place an author learns a slug was renamed.

Never search an untrimmed query, and never search title alone. Trim, tokenise, fold diacritics, include tags and headings, rank by field.

Never hardcode chrome strings in a host with an i18n system. Every string goes through HelpStrings, so the header, footer and notices switch locale together.

Never key a tag by its spelling. Case, hyphens and plurals drift across authors. Group by tagSlug so every variant lands on one page, and let the validator report the drift.

Quick start

  1. Fill in the seam contract and settle the category ids — adaptation.md.
  2. Choose the content layout and write the config — content-model.md.
  3. Copy the loader and frontmatter parser; run the validator on the real content immediately — content-loader.md.
  4. Wire strings and paths to the host's i18n — i18n.md.
  5. Add the three pages, SEO helpers and sitemap entries — routes.md — then the tag page and linked chips — tags.md.
  6. Build the shell, navigation tree and drawer — ui.md — then the breadcrumb, cards, lists and renderer on the host's primitives — ui-content.md.
  7. Drop in search and its hook; wire the zero-result hook to analytics — search.md.
  8. Run the shipped tests, then check the behaviour contract: longest category fully reachable, trailing-space query, accented query, untranslated page's canonical.

Reference directory

ScenarioTrigger keywordsReference
Fitting this into an existing appadapt, seam, rename categories, host probe, integrate, dependenciesadaptation.md
Frontmatter, folders, slugs, validationfrontmatter, slug, category, order, related, updatedAt, featured, validate, CIcontent-model.md
Reading files into the indexloader, gray-matter, cache, fallback, headings, sort, index, fscontent-loader.md
Search box and rankingsearch, combobox, ranking, tokenize, diacritics, prefix, keyboard, no resultssearch.md
Tags, tag pages, chips, tag cloudtag, tags, tag page, chip, tag slug, spelling, plural, browse by tagtags.md
Locales, strings, dates, canonicalsi18n, locale, translation, fallback, hreflang, strings, plural, Intli18n.md
Pages, metadata, JSON-LD, sitemaproute, page.tsx, generateStaticParams, dynamicParams, notFound, canonical, TechArticle, sitemaproutes.md
Shell, header, sidebar, drawerlayout, sidebar, mobile menu, drawer, collapsible, sticky, HelpShellui.md
Breadcrumb, cards, lists, renderer, style hooksbreadcrumb, category card, article list, react-markdown, data-help, stylingui-content.md
Beyond the shipped modulefull-text, Pagefind, TOC, feedback, git dates, MDX, CMS, redirectsextensions.md
Why the templates differ from the earlier implementationprovenance, audit, ledger, kept deliberately, fixing the earlier implementationprovenance.md

관련 스킬

steipete/notion

Notion CLI/API for pages, Markdown content, data sources, files, comments, search, Workers, and raw API calls.

community

affaan-m/seo

Audit, plan, and implement SEO improvements across technical SEO, on-page optimization, structured data, Core Web Vitals, and content strategy. Use when the user wants better search visibility, SEO remediation, schema markup, sitemap/robots work, or keyword mapping.

community

affaan-m/brand-voice

Build a source-derived writing style profile from real posts, essays, launch notes, docs, or site copy, then reuse that profile across content, outreach, and social workflows. Use when the user wants voice consistency without generic AI writing tropes.

community

affaan-m/crosspost

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

community

affaan-m/x-api

X/Twitter API integration for posting tweets, threads, reading timelines, search, and analytics. Covers OAuth auth patterns, rate limits, and platform-native content posting. Use when the user wants to interact with X programmatically.

community

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

community