This document defines all metadata fields used in GeoHazardWatch page frontmatter (YAML header), designed for full Schema.org WebPage compliance to ensure optimal SEO and semantic web integration.
GeoHazardWatch metadata fields directly map to Schema.org WebPage properties for maximum semantic web compatibility and search engine optimization.
title)nametitle)headlinetitle fielduuid)identifierlastModified)dateModifiedYYYY-MM-DDTHH:mm:ss.sssZurl"system" | "user" | "documentation"system: App-managed, can be replaced during upgradesuser: User-managed, always preserved during upgrades documentation: Developer-managed, versioned with appsystem - Categories, PageIndex, SystemInfouser - Welcome, project pages, personal contentdocumentation - API docs, user guides, developer docsadditionalTypesystem-category are assigned by Admin
user-keywords)User Keywords defines keywords that are set by users
System Keywords are assigned by the system.
Currently the only value is "general"
categories)about[System, Documentation]dateCreatedYYYY-MM-DDTHH:mm:ss.sssZauthorisPartOfbreadcrumbcategories array (not hierarchical category field)categories: [Documentation, Developer, API] generates breadcrumb: Documentation → Developer → APImainContentOfPage.wiki-contentsignificantLink"user" | "developer" | "api"user: End-user documentation and tutorialsdeveloper: Technical implementation guidesapi: API reference and integration docsdeveloperaudience propertytrue: Read-only for users, system-managedfalse: User-editable contenttrue for pageType: "system"trueDigitalDocumentPermission objects for machine-readable access controlpage:edit, admin:system)inLanguagelicensepublisher---
# Required Schema.org WebPage Properties
title: "API Documentation" # → name, headline
pageType: "documentation" # → additionalType (ngdpbase-specific)
category: "Developer" # → about (DefinedTerm) - storage-based
uuid: "api-docs-v1-uuid" # → identifier
lastModified: "2025-09-10T10:00:00.000Z" # → dateModified
# Optional Schema.org Enhanced Properties
user-keywords: [api, reference, integration] # → keywords
categories: [Developer, API] # → about (multiple DefinedTerms) - detailed classification
documentationType: "api" # → audience enhancement
dateCreated: "2025-09-01T10:00:00.000Z" # → dateCreated
isProtected: true # → access control (not Schema.org)
# Auto-generated Schema.org Properties (not in frontmatter):
# url: "https://example.com/view/API Documentation"
# author: { "@type": "Organization", "name": "ngdpbase Platform" }
# publisher: { "@type": "Organization", "name": "ngdpbase Platform" }
# isPartOf: { "@type": "WebSite", "name": "ngdpbase Platform", "url": "/" }
# breadcrumb: { "@type": "BreadcrumbList", ... } (from categories array)
# mainContentOfPage: { "@type": "WebPageElement", "cssSelector": ".wiki-content" }
# inLanguage: "en-US"
# license: "https://example.com/terms"
---
The above metadata generates this Schema.org JSON-LD:
{
"@context": "https://schema.org",
"@type": "WebPage",
"name": "API Documentation",
"headline": "API Documentation",
"url": "https://example.com/view/API%20Documentation",
"identifier": "api-docs-v1-uuid",
"dateModified": "2025-09-10T10:00:00.000Z",
"dateCreated": "2025-09-01T10:00:00.000Z",
"inLanguage": "en-US",
"keywords": "api, reference, integration",
"about": [
{
"@type": "DefinedTerm",
"name": "Developer",
"inDefinedTermSet": {
"@type": "DefinedTermSet",
"name": "ngdpbase Categories"
}
},
{
"@type": "DefinedTerm",
"name": "API",
"inDefinedTermSet": {
"@type": "DefinedTermSet",
"name": "ngdpbase Categories"
}
}
],
"breadcrumb": {
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Developer",
"item": "https://example.com/category/Developer"
},
{
"@type": "ListItem",
"position": 2,
"name": "API",
"item": "https://example.com/category/API"
}
]
},
"mainContentOfPage": {
"@type": "WebPageElement",
"cssSelector": ".wiki-content"
},
"isPartOf": {
"@type": "WebSite",
"name": "ngdpbase Platform",
"url": "https://example.com/"
},
"author": {
"@type": "Organization",
"name": "ngdpbase Platform"
},
"publisher": {
"@type": "Organization",
"name": "ngdpbase Platform"
},
"hasDigitalDocumentPermission": [
{
"@type": "DigitalDocumentPermission",
"permissionType": "ReadPermission",
"grantee": {
"@type": "Audience",
"audienceType": "public"
}
},
{
"@type": "DigitalDocumentPermission",
"permissionType": "WritePermission",
"grantee": {
"@type": "Audience",
"audienceType": "developer"
}
},
{
"@type": "DigitalDocumentPermission",
"permissionType": "CreatePermission",
"grantee": {
"@type": "Audience",
"audienceType": "developer"
}
},
{
"@type": "DigitalDocumentPermission",
"permissionType": "DeletePermission",
"grantee": {
"@type": "Person",
"name": "admin"
}
},
{
"@type": "DigitalDocumentPermission",
"permissionType": "UploadPermission",
"grantee": {
"@type": "Audience",
"audienceType": "contributor"
}
},
{
"@type": "DigitalDocumentPermission",
"permissionType": "CommentPermission",
"grantee": {
"@type": "Audience",
"audienceType": "authenticated"
}
}
]
}
| ngdpbase Field | Schema.org Property | Required | Type | Max Values | Auto-Generated |
|---|---|---|---|---|---|
title | name, headline | ✅ Yes | Text | 1 | No |
uuid | identifier | ✅ Yes | PropertyValue/Text | 1 | Yes |
lastModified | dateModified | ✅ Yes | DateTime | 1 | Yes |
pageType | additionalType | ✅ Yes | Text | 1 | No |
category | about (DefinedTerm) | ✅ Yes | DefinedTerm | 1 | No |
user-keywords | keywords | ❌ No | Text | 3 | No |
categories | about (multiple) | ❌ No | DefinedTerm | 3 | No |
dateCreated | dateCreated | ❌ No | DateTime | 1 | Optional |
documentationType | audience (enhanced) | ❌ No | Text | 1 | No |
isProtected | hasDigitalDocumentPermission | ❌ No | DigitalDocumentPermission | Multiple | Yes |
| (auto) | url | ✅ Yes | URL | 1 | Yes |
| (auto) | author | ✅ Yes | Organization | 1 | Yes |
| (auto) | publisher | ✅ Yes | Organization | 1 | Yes |
| (auto) | isPartOf | ✅ Yes | WebSite | 1 | Yes |
| (auto) | breadcrumb | ❌ No | BreadcrumbList | 1 | Yes |
| (auto) | mainContentOfPage | ❌ No | WebPageElement | 1 | Yes |
| (auto) | inLanguage | ✅ Yes | Language | 1 | Yes |
| (auto) | license | ❌ No | URL/CreativeWork | 1 | Yes |
title (maps to Schema.org name)pageType for operational requirements:user for personal/project content (preserved during upgrades)documentation for user guides and tutorialscategory (maps to Schema.org about)user-keywords from the merged available list:/required-pages/User Keywords.md/users/user-keywords.jsonuuid or lastModified fieldsUser keywords need to be:
| Storage Location | Purpose | Upgrade Behavior | Content Type |
|---|---|---|---|
/required-pages/User Keywords.md | **Base Keywords** | Replaced | App-provided defaults |
/users/user-keywords.json | **User Extensions** | Preserved | User-added keywords |
| Runtime Merge | **Combined List** | Automatic | Base + User extensions |
/required-pages/User Keywords.md)---
title: User Keywords
pageType: system
isProtected: true
---
# User Keywords
## Base System Keywords
- documentation
- test
- system
- template
- security
- api
- reference
- integration
/users/user-keywords.json){
"userDefinedKeywords": [
"geology",
"medicine",
"psychology",
"project-planning",
"personal"
],
"lastModified": "2025-09-10T10:00:00.000Z",
"addedBy": {
"admin": ["geology", "medicine"],
"user1": ["psychology"],
"user2": ["project-planning", "personal"]
}
}
/required-pages/User Keywords.md/users/user-keywords.json# 1. Backup user extensions (automatic)
cp /users/user-keywords.json /users/user-keywords.backup.json
# 2. Replace base keywords (app-managed)
# /required-pages/User Keywords.md gets new app defaults
# 3. Merge user extensions (automatic)
# System reads both files and merges at runtime
# 4. Validate & clean (post-upgrade)
# Remove any invalid keywords, update JSON format if needed
/users/user-keywords.json/users/user-keywords.jsonclass KeywordManager {
async getAvailableKeywords() {
const baseKeywords = await this.loadBaseKeywords();
const userKeywords = await this.loadUserKeywords();
return this.mergeAndDeduplicate(baseKeywords, userKeywords);
}
async addUserKeyword(keyword, userId) {
// Add to /users/user-keywords.json
// Validate against existing keywords
// Track who added it for audit
}
async removeUserKeyword(keyword, userId) {
// Remove from /users/user-keywords.json only
// Cannot remove base keywords
}
}
/required-pages/User Keywords.md with system defaults/users/user-keywords.json with user additionsuser-keywords still valid after merge✅ Upgrade Safety: User keywords never lost during app updates
✅ Extensibility: Users can add keywords without editing system files
✅ Consistency: Base keywords ensure common vocabulary across installations
✅ Audit Trail: Track who added which keywords for management
✅ Performance: Merging happens at edit time, not page load time
✅ Backup: User extensions automatically preserved and trackable
pageType: "documentation" for all developer docsdocumentationType for target audienceurl, author, publisher✅ @context: "https://schema.org"
✅ @type: "WebPage"
✅ name: From title field
✅ url: Auto-generated from base URL + page title
✅ dateModified: From lastModified field
🔄 headline: From title field
🔄 identifier: From uuid field
🔄 keywords: From user-keywords array
🔄 about: From category and categories fields as DefinedTerms
🔄 breadcrumb: Auto-generated from hierarchical categories
🔄 author: Auto-generated Organization object
🔄 publisher: Auto-generated Organization object
🔄 isPartOf: Auto-generated WebSite object
🔄 mainContentOfPage: Auto-generated WebPageElement
🔄 inLanguage: Auto-generated "en-US"
| Category | Storage Location | Upgrade Behavior | Management | Purpose |
|---|---|---|---|---|
General | /pages/ | Always Preserved | User | User-generated content |
System | /required-pages/ | May be Replaced | App | Required system pages |
Documentation | /required-pages/ | Updated with App | App | User documentation |
Developer | /docs/ | Versioned | Developer | Technical documentation |
/pages/ (General Category)category: "General"category: "General", user-keywords: [project]category: "General", user-keywords: [meeting, planning]/required-pages/ (System Category)category: "System"category: "System", isProtected: truecategory: "System", isProtected: true/required-pages/ (Documentation Category)category: "Documentation"category: "Documentation", user-keywords: [tutorial]category: "Documentation", user-keywords: [reference]/docs/ (Developer Category)category: "Developer", user-keywords: [api, reference]category: "Developer", user-keywords: [guide]category: "Developer", user-keywords: [design]Primary: Storage-based categories determine file location and upgrade behavior
Secondary: User-keywords provide detailed content classification and filtering
This approach separates operational concerns (where files live) from content concerns (what they contain).
ngdpbase uses Schema.org WebPage as the primary entity type for full compliance with web standards and optimal SEO performance.
Schema.org WebPage is the most appropriate entity type for page content because:
breadcrumb, mainContentOfPage, significantLink| Page Category | Schema.org Type | Primary Reasoning | Additional Properties |
|---|---|---|---|
| **All Pages** | **WebPage** | Universal web standard | breadcrumb, mainContentOfPage |
| System/* | **WebPage** | Navigation-heavy reference pages | significantLink array |
| Documentation | **WebPage** + TechArticle | Technical content with web navigation | about with DefinedTerm |
| Project | **WebPage** + CreativeWork | Planning docs with collaboration | author, contributor |
| Meeting Notes | **WebPage** + Article | Time-based collaborative content | dateCreated, dateModified |
| General | **WebPage** | Standard page structure | Core WebPage properties |
Note: GeoHazardWatch defaults to WebPage for all content, with additional types layered on through additionalType or about properties when appropriate.
@context: "https://schema.org"@type: "WebPage" name: Page titleurl: Full page URLdateModified: Last modification timestampheadline: Page title (for article-like content)identifier: Unique UUIDkeywords: User-defined tagsabout: Categories as DefinedTerm objectsbreadcrumb: Hierarchical navigationmainContentOfPage: Main content elementsignificantLink: Important page linksisPartOf: Parent website referenceauthor: Content author (Organization or Person)publisher: Publishing organizationinLanguage: Content languagelicense: Content license informationAll GeoHazardWatch pages generate Schema.org WebPage JSON-LD that validates against:
See system-category for category configuration, System Keywords and User Keywords for keyword management, and User Documentation for related guides.