The problem
What problem does Markdown help center solve?
Every product needs a place where customers find answers without writing to support. A help center is the simplest one: articles in categories, a search box, links between them.
The usual way to get one is a CMS or a hosted knowledge base. That means another login, another monthly fee, and content that lives outside your repository, out of step with the product.
This skill builds the help center from markdown files in the repository. An article is a file with a short header. The build renders the landing, category, tag and article pages. Search ranks results and forgives a trailing space or a missing accent. The build fails when an article is unreachable or a link points nowhere. A language without a translation falls back to the default instead of an empty page.
The module
What does the skill build?
An agent with this skill builds one module for a Next.js App Router app, on your stack. For Markdown help center that module consists of:
- 1. Category, tag and article pages
- 2. Ranked client-side search
- 3. Locale fallback
- 4. JSON-LD
- 5. Sitemap
- 6. CI content validator
Provenance
Where do the rules come from?
A help center is a small static site with one hard requirement: every article must be reachable: from the sidebar, from search, from a locale that has not been translated yet. This skill was written by the engineer who has shipped this module; the earlier implementation it was audited against was a marketing-site help center. The templates hold that requirement as verified properties: the sidebar shows every article of every category, the parser reads every frontmatter shape the corpus uses and the validator fails the build on the ones it cannot, tags group by slug so one label reaches one page however it is spelled, and search ranks a query however it is typed, trailing space and diacritics included. The loader, search and tag suites cover each of those; references/provenance.md carries the record.
Written by the engineer who has shipped this module. The earlier implementation it was audited against, a marketing-site help center, ran a few dozen markdown articles in category folders, English content served under several locale prefixes, client-side search, a collapsible sidebar and a mobile drawer, JSON-LD and sitemap integration. The architecture is that module's. The templates are not a transcription of it: the audit below is why.
The ledger separates what the audit changed, what was kept on purpose, and what has not run in production yet.
Fixed in the templates
- The sidebar hid half of the biggest category The desktop sidebar animated category collapse with
max-h-[600px]+overflow-hidden. The largest category's list was more than twice the height of the cap, so more than half of its links were unreachable from the sidebar. The mobile drawer used a much larger cap and was fine, so nobody testing on a phone saw it, and on desktop the list simply looked complete. - Search that missed what people typed Substring match on title and description only. Consequences, each verified in the code:
- Order ties resolved by filesystem order Articles sorted by
orderonly. The corpus had three pairs sharing an order (2,5,27). JavaScript's sort is stable, so ties keptreaddirorder — which is alphabetical on APFS, creation order on some Linux filesystems, and not guaranteed anywhere. The same deploy could list two articles in a different order on a different build machine. - Related links that vanish silently
relatedentries were resolved by slug across every category, and unresolved ones were dropped without a warning anywhere. Renaming an article broke every inboundrelatedreference invisibly. Slugs were also only unique per folder, so a bare reference could resolve to the wrong category's article. - The corpus re-parsed several times per page Six loader functions each walked the tree. One article render called them from the layout, the page,
generateMetadataand the related resolver — around four full parses of every file per page, and again per locale ingenerateStaticParams.
Show 9 moreShow fewer
- "Popular articles" that were not The landing page showed
getAllHelpArticles().slice(0, 6)under the heading Popular articles: the first six files of the first folder, byorder. - English chrome on a three-locale site The site rendered Polish and German everywhere except the help center, whose header, sidebar, buttons, category labels and "Updated {en-US date}" were literals — in an app with a working i18n dictionary that the same component tree used for its footer.
- order: 0 sorted last
(frontMatter.order as number) || 999— zero is falsy. Minor, but the kind of thing that wastes an afternoon. - Invalid structured data when a date was missing
dateModified: article.updatedAtemitted""for articles without a date. JSON-LD was also interpolated unescaped; a</script>in a title would have ended the block. - Dead code A
HelpSearchBarcomponent rendering a disabled input labelled "Soon", and agetHelpArticlesByTagfunction — both exported, neither imported anywhere. - Frontmatter that lied without consequence
slugandcategoryin frontmatter were ignored by the loader (filename and folder win). Nothing detected a mismatch. The corpus had none — but the next copy-pasted file would. - A frontmatter parser that dropped multi-line values The earlier implementation parsed frontmatter line by line:
key: value, JSON-parse anything in[...]. Prettier wraps arrays past 100 columns onto several lines, and every such value read as empty, silently. Found in the earlier implementation hours after the audit, when a new article'srelatedlist came out blank: roughly a quarter of the content files across every markdown content type sharing the parser had an empty list field in production,relatedandtagsamong them, including cards that had rendering code and had never once rendered. - Tags keyed by spelling The earlier implementation's only tag lookup,
getHelpArticlesByTag, matched the exact string (tags.includes(tag)), and nothing ever normalised a tag for a URL. Run over the corpus, the 0.2.0 validator found, invisible on the site: - What validation found in the real corpus Running the shipped validator over the earlier implementation's content on audit day: 3 order ties, 0 unresolved references, 0 slug mismatches, and 37 of 65
updatedAtvalues identical (the import date). None of these were visible on the site. The date problem is a content problem; deriving dates from git is in extensions.md.
- The sidebar hid half of the biggest category The desktop sidebar animated category collapse with
Non-negotiables
What are the 4 rules the module never breaks?
Every module built from this skill holds these, whoever builds it. The same list is in the skill's README and SKILL.md, so the agent reads it before it writes a line.
Summaries, never articles, cross to the client.
toSummary/toSearchDocare the only shapes client components accept, so a page carries about a kilobyte per article rather than the whole corpus; the type signatures enforce it.hidden, not a height cap, on collapsible nav.A height cap clips whatever does not fit and reports nothing;
hiddenrenders every link of every category or none, and the shell template uses only that.Untranslated pages canonicalise to the default locale
and stay out of hreflang and the sitemap, so a fallback page is never indexed as a duplicate; the loader test flags the fallback and the routes read that flag.
Validation runs in CI.
The runtime is forgiving on purpose, dropping bad refs and sorting missing orders last, and
validate:helpfails the build for the author; the validator tests cover unresolved refs, order ties and skipped files.
Fit
When should you use it, and when not?
Use it for
- 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.
Not for
- A blog: dated, authored posts with covers and localized slugsInsteadThe sibling `blog-markdown` skill; a different content model
- Docs generated from code (OpenAPI, TypeDoc)InsteadTheir generators; link to the output
- A CMS-backed help site with editors publishing at runtimeInsteadThe index contract still applies, but the loader, static params and validation change; see the CMS note in
references/extensions.md - Marketing pages that happen to be markdownInsteadThe host's renderer; this module is the navigation, search and locale model around many articles
Build it yourself
How do I install it?
One command. The skills.sh CLI installs the skill into every skills-compatible agent it finds.
$ npx skills add timerise-ai/help-center-markdownClaude Code
Invoke with /help-center-markdown
Codex CLI
Invoke with $help-center-markdown
Gemini CLI
Invoke with /skills
Name the agents instead with -a, for example npx skills add timerise-ai/help-center-markdown -a claude-code -a codex. Or clone the repository into your agent's skills folder. Nothing in it is agent-specific.
What is inside the repository (12 entries)
SKILL.mdEntry point: architecture, critical facts, hard rules, and the reference directoryreferences/adaptation.mdThe seam contract with the host app: styling, i18n, routing, the category renamereferences/content-model.mdConfig, types, frontmatter fields, slugs, and the CI validatorreferences/content-loader.mdReading files into the index: gray-matter, caching, locale fallback, sortingreferences/search.mdClient-side search: tokenizing, ranking, combobox keyboard behavior, no-resultsreferences/tags.mdTag slug identity, tag pages, chips, tag cloud, tag validationreferences/i18n.mdLocales, strings, dates, default-locale fallback, hreflang and canonicalsreferences/routes.mdPages,generateStaticParams, metadata, JSON-LD, sitemap entriesreferences/ui.mdShell, header, sidebar, mobile drawerreferences/ui-content.mdBreadcrumbs, category cards, article lists, the markdown renderer, style hooksreferences/extensions.mdFull-text/Pagefind, table of contents, feedback, git dates, MDX, CMS, redirectsreferences/provenance.mdThe engineering ledger: what the audit of the earlier implementation changed and how the templates verify it, what was kept on purpose, what is new
Recent releases
- v0.2.9September 21, 2026
Wording release. The skill content is unchanged from 0.2.8.
- v0.2.8September 2, 2026
Wording release. Templates and technical content are unchanged from 0.2.7.
- v0.2.7September 2, 2026
Wording release. Templates and technical content are unchanged from 0.2.6.
After installing
What do I tell my agent?
Say what you need in your own words; the skill supplies the how. These are starting points.
Add a help center to this Next.js app from markdown files in content/help: category pages, article pages, search, and a sitemap entry for every article.
Repository filesOur docs are markdown files in English and German. Build /help with a locale fallback, so an article missing in German shows the English one instead of a 404.
Repository filesAudit our help center: search misses articles, categories sort inconsistently and some tags are spelled two ways.
Build it with Timerise
How long does it take, and what does it cost?
We quote this module per project. The price depends on what it has to connect to. The path to a number is short and free:
Step 1
Brief
Tell us what the module must connect to. Takes minutes, in a chat.
Step 2
Prototype in 48 hours
A clickable prototype of your system and a quote, at no cost.
Step 3
Build and handoff
One project price. Source code, documentation and IP are yours.
Two ways to get Markdown help center
Build it yourself
Install the skill. Your own agent builds the module.
- MIT licensed, no strings
- Runs in Claude Code, Codex CLI and Gemini CLI
- The same rules our engineers build by
$ npx skills add timerise-ai/help-center-markdownBuild it with Timerise
Send a brief. We build Markdown help center into a system you own.
- Clickable prototype and a quote within 48 hours, free
- One project price, no subscription, no commission
- Source code, documentation and IP handed over
Generated from the skill's own files at commit fb9507c. Every rule above links to where the repository says it. All skills