Frontmatter Schema
Required fields
Every Markdown file must include all of these fields in its YAML frontmatter.
| Field | Type | Constraints | Description |
|---|---|---|---|
title |
string | 1–200 chars | Display title. Rendered as the page H1 and title tag. |
slug |
string | 1–200 chars, lowercase alphanumeric + hyphens, optional / |
URL slug. Must be unique and match the file path. |
description |
string | 10–300 chars | Meta description for search and SEO. |
author |
string | 1–200 chars | Entra ID email or team alias. |
status |
enum | draft, in-review, published, archived |
Content lifecycle status. |
created |
string | ISO 8601 | Creation timestamp. Set once, never changed. |
updated |
string | ISO 8601 | Last-modified timestamp. Updated on every save. |
Optional fields
| Field | Type | Default | Constraints | Description |
|---|---|---|---|---|
owner |
string | -- | Max 100 chars | Team alias for CODEOWNERS mapping. |
tags |
string[] | [] |
Max 20 tags, each max 50 chars | Taxonomy tags for search faceting. |
lastReviewed |
string | -- | ISO 8601 | Date of last manual content review. |
reviewCycle |
integer | 90 |
1–3650 | Days between required reviews. |
template |
enum | -- | doc-page, how-to, reference, blog-post, proposal, rfp |
Editor template hint. |
order |
integer | -- | Min 0 | Sort order within parent directory. Lower first. |
toc |
boolean | true |
-- | Show right-side table of contents. |
search |
boolean | true |
-- | Include in the search index. |
redirect_from |
string[] | [] |
Each must start with / |
Legacy URL redirect paths. |
access |
enum | inherited | public, internal, confidential, admin |
Content visibility tier. If omitted, inherits from section index.md. Global default is internal. See Understanding access tiers. |
contentScopes |
string[] | [] |
Max 10 lowercase slugs or area/topic paths |
Additional logical read scopes. Values on an index.md are inherited by descendants and supplement the automatic area/subsection scope. |
recordType |
enum | -- | proposal, rfp |
Immutable tracked-record type. Required for proposal/RFP templates. |
recordId |
string | -- | PROP-YYYY-NNNN, RFP-YYYY-NNNN |
Immutable annual sequence allocated atomically by the registry. |
Tracked record lifecycle
Tracked records live under content/docs/proposals/. Git stores only immutable identity:
recordType, recordId, and the derived proposals/<lowercase-record-id> slug. The registry in
Table Storage owns mutable status, owner, due date, comment policy, audit events, and archival.
Registry states are draft, open-for-comment, in-review, approved, released, rejected,
withdrawn, superseded, closed, and archived. Website comments accept new entries only when
the comment policy is open. State changes never move comments to another page or physically remove
them.
Date format
Dates must be ISO 8601:
created: 2026-04-10T00:00:00Z # Full datetime (UTC)
created: 2026-04-10 # Date only
created: 2026-04-10T12:30:00+05:00 # With timezone offsetSlug format
Slugs must be lowercase alphanumeric with hyphens, with optional / for path segments:
slug: getting-started # Top-level page
slug: guides/architecture # Nested page
slug: hub-docs/deployment/ci-cd-pipelines # Deep nestingStatus values
| Status | In nav/search | Accessible |
|---|---|---|
draft |
No | Contributors only |
in-review |
Partial | Yes |
published |
Yes | Yes |
archived |
No | Direct URL only |
Full example
---
title: Deployment Guide
slug: hub-docs/deployment/infrastructure
description: How to deploy the Hub Docs infrastructure using Azure Bicep.
author: platform-team@contoso.com
status: published
created: 2026-04-10T00:00:00Z
updated: 2026-04-10T00:00:00Z
owner: platform-team
tags: [deployment, bicep, infrastructure]
lastReviewed: 2026-04-10
reviewCycle: 90
template: how-to
order: 1
toc: true
search: true
access: internal
contentScopes: [networking, exp/networking]
---