Content Schemas
This reference documents the structure and validation rules for all content types in the site.
These schemas define what fields are required, what types they accept, and what validation rules
apply. The documentation below is auto-generated directly from the Zod schemas in src/content/config.ts, so it's always in sync with the actual code—no manual updates needed.
Use this reference when creating or editing content to understand what fields are available, which ones are required, and what format they expect. Each schema includes an example to help you get started quickly.
Articles
Technical guides, tutorials, and blog posts
src/content/articles/*.md
·
Browse on GitHub ↗
Example
---
title: "Getting Started with FT8"
description: "A beginner's guide to digital modes"
author: "Jane Smith, W1ABC"
date: 2026-01-15
tags: ["digital-modes", "ft8", "beginner"]
featured: true
---
Fields
-
titlestring required - Page or content title
-
descriptionstring - Brief summary for SEO and previews
-
authorstring - Author name and callsign (e.g., "Jane Smith, W1ABC")
-
datestring - Publication date (YYYY-MM-DD)
-
updatedstring - Last update date (YYYY-MM-DD)
-
draftboolean =false - If true, excluded from production builds
-
publishDatestring - Scheduled publish date (YYYY-MM-DD)
-
featuredboolean =false - If true, highlighted in listings
-
tagsstring[] =[] - Lowercase, hyphenated keywords for filtering
-
coverstring - Cover image path (relative, e.g., ./cover.jpg)
-
coverAltstring - Alt text for cover image (required if cover is set)
-
categorystring - Article category (e.g., "guides", "news", "reviews")
Documentation
Reference documentation and technical specs
src/content/docs/*.md
·
Browse on GitHub ↗
Example
---
title: "Antenna Theory Basics"
description: "Understanding antenna fundamentals"
author: "John Doe, K2XYZ"
date: 2026-01-10
section: "antennas"
order: 1
---
Fields
-
titlestring required - Page or content title
-
descriptionstring - Brief summary for SEO and previews
-
authorstring - Author name and callsign (e.g., "Jane Smith, W1ABC")
-
datestring - Publication date (YYYY-MM-DD)
-
updatedstring - Last update date (YYYY-MM-DD)
-
draftboolean =false - If true, excluded from production builds
-
publishDatestring - Scheduled publish date (YYYY-MM-DD)
-
featuredboolean =false - If true, highlighted in listings
-
tagsstring[] =[] - Lowercase, hyphenated keywords for filtering
-
coverstring - Cover image path (relative, e.g., ./cover.jpg)
-
coverAltstring - Alt text for cover image (required if cover is set)
-
ordernumber =0 - Sort order within section (lower = first)
-
sectionstring - Documentation section for grouping
-
tocboolean =true - If true, shows table of contents
Events
Meetings, field days, contests, and activities
src/content/events/{date}-{slug}/index.md
·
Browse on GitHub ↗
Example
---
title: "January Meeting"
description: "Monthly club meeting"
author: "Club Secretary"
eventDate: 2026-01-20
startTime: "6:00 PM"
endTime: "8:30 PM"
venue: "building-31"
onlineMeeting: "microhams-teams"
eventType: "meeting"
---
Fields
Core
-
titlestring required - Page or content title
-
descriptionstring - Brief summary for SEO and previews
-
authorstring - Author name and callsign (e.g., "Jane Smith, W1ABC")
-
draftboolean =false - If true, excluded from production builds
-
featuredboolean =false - If true, highlighted in listings
-
tagsstring[] =[] - Lowercase, hyphenated keywords for filtering
Date & Time
-
eventDatestring required - Event date (YYYY-MM-DD), interpreted in event timezone
-
endDatestring - End date for multi-day events (YYYY-MM-DD)
-
startTimestring - Start time (e.g., "6:00 PM" or "18:00")
-
endTimestring - End time (e.g., "8:30 PM" or "20:30")
-
timezonestring - IANA timezone (e.g., "America/Los_Angeles"). Defaults to venue or site timezone
Location
-
venue"building-31" | "puyallup-fairgrounds-pavilion" | "custom" - Venue key from site.config.ts (provides address, coords, directions)
-
locationstring - Location override or additional directions
-
latitudenumber - Map latitude (overrides venue/customVenue)
-
longitudenumber - Map longitude (overrides venue/customVenue)
-
coordFrequencystring - Radio frequency for on-site coordination (e.g., "146.580")
Online
-
onlineMeetingstring - Meeting key from site.config.ts (e.g., "microhams-teams")
-
teamsobject - Direct Teams meeting details (if not using config key)
-
virtualLinkstring - Meeting URL for other platforms (Zoom, etc.)
Metadata
-
eventType"meeting" | "conference" | "field-day" | "contest" | "social" | "workshop" | "external" ="meeting" - Event category for filtering and display
-
registrationRequiredboolean =false - If true, shows registration info
-
registrationLinkstring - URL to registration form
-
contactPersonstring - Event contact name and callsign
-
contactEmailstring - Event contact email
-
showDisclaimerboolean =true - If true, shows recording/privacy notice for online meetings
Images
-
coverstring - Cover image path (relative, e.g., ./cover.jpg)
-
coverAltstring - Alt text for cover image (required if cover is set)
Publishing
-
updatedstring - Last update date (YYYY-MM-DD)
-
publishDatestring - Scheduled publish date (YYYY-MM-DD)
Other
-
customVenueobject - One-off venue (use instead of venue key for non-recurring locations)
-
eventLinkstring - Link to external event page (for events we don't organize)
Pages
General site pages
src/content/pages/*.md
·
Browse on GitHub ↗
Example
---
title: "About Us"
description: "Learn about our club"
layout: "default"
---
Fields
-
titlestring required - Page or content title
-
descriptionstring - Brief summary for SEO and previews
-
authorstring - Author name and callsign (e.g., "Jane Smith, W1ABC")
-
datestring - Publication date (YYYY-MM-DD)
-
updatedstring - Last update date (YYYY-MM-DD)
-
draftboolean =false - If true, excluded from production builds
-
publishDatestring - Scheduled publish date (YYYY-MM-DD)
-
featuredboolean =false - If true, highlighted in listings
-
tagsstring[] =[] - Lowercase, hyphenated keywords for filtering
-
coverstring - Cover image path (relative, e.g., ./cover.jpg)
-
coverAltstring - Alt text for cover image (required if cover is set)
-
layout"default" | "full-width" | "minimal" ="default" - Page layout variant
-
hideHeaderboolean =false - If true, hides the page header/title block
Images
Technical requirements for images in content. For editorial guidance (rights, composition, alt text), see the Editorial Guidelines.
Hosting requirements
All images must be hosted in this repository. Never link to images on external websites—they can change, disappear, or create legal issues. The only exception is linking to official sources (e.g., ARRL logos from arrl.org) when specifically required by licensing terms.
File location
Place images in the same folder as your content file, then reference them with a relative path:
src/content/events/2026-01-january-meeting/
├── index.md
├── cover.jpg # Referenced as ./cover.jpg
└── diagram.png # Referenced as ./diagram.png Size requirements
| Constraint | Requirement | Why |
|---|---|---|
| Minimum width | 800px | Ensures clarity on high-DPI displays |
| Maximum width | 2400px | Larger provides no benefit, wastes bandwidth |
| Maximum file size | 500 KB (photos), 100 KB (diagrams) | Fast page loads on mobile connections |
Optimization: Astro automatically generates responsive sizes and converts to WebP format at build time. Provide a high-quality source image and let the build process handle optimization.
Supported formats
| Format | Use for | Notes |
|---|---|---|
.jpg / .jpeg | Photos | Best compression for photographic images |
.png | Screenshots, diagrams with text | Lossless, supports transparency |
.svg | Icons, logos, simple diagrams | Vector format, scales perfectly |
.webp | Any (if already optimized) | Modern format, excellent compression |
SVG and dark mode
SVG files should work in both light and dark modes. Avoid hard-coded colors like
fill="#000000" that become invisible on dark backgrounds.
Options for dark mode compatibility:
- Use
currentColor— inherits text color automatically - Provide two versions —
diagram.svganddiagram-dark.svg - Use CSS variables — reference
var(--color-text)in inline SVG
Cover images
Articles and events can have a cover image that appears in cards and at the top of
the page. Always provide coverAlt with descriptive alt text.
cover: "./cover.jpg"
coverAlt: "Members setting up antennas at the Winter Field Day site"