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

title string required
Page or content title
description string
Brief summary for SEO and previews
author string
Author name and callsign (e.g., "Jane Smith, W1ABC")
date string
Publication date (YYYY-MM-DD)
updated string
Last update date (YYYY-MM-DD)
draft boolean = false
If true, excluded from production builds
publishDate string
Scheduled publish date (YYYY-MM-DD)
featured boolean = false
If true, highlighted in listings
tags string[] = []
Lowercase, hyphenated keywords for filtering
cover string
Cover image path (relative, e.g., ./cover.jpg)
coverAlt string
Alt text for cover image (required if cover is set)
category string
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

title string required
Page or content title
description string
Brief summary for SEO and previews
author string
Author name and callsign (e.g., "Jane Smith, W1ABC")
date string
Publication date (YYYY-MM-DD)
updated string
Last update date (YYYY-MM-DD)
draft boolean = false
If true, excluded from production builds
publishDate string
Scheduled publish date (YYYY-MM-DD)
featured boolean = false
If true, highlighted in listings
tags string[] = []
Lowercase, hyphenated keywords for filtering
cover string
Cover image path (relative, e.g., ./cover.jpg)
coverAlt string
Alt text for cover image (required if cover is set)
order number = 0
Sort order within section (lower = first)
section string
Documentation section for grouping
toc boolean = 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

title string required
Page or content title
description string
Brief summary for SEO and previews
author string
Author name and callsign (e.g., "Jane Smith, W1ABC")
draft boolean = false
If true, excluded from production builds
featured boolean = false
If true, highlighted in listings
tags string[] = []
Lowercase, hyphenated keywords for filtering

Date & Time

eventDate string required
Event date (YYYY-MM-DD), interpreted in event timezone
endDate string
End date for multi-day events (YYYY-MM-DD)
startTime string
Start time (e.g., "6:00 PM" or "18:00")
endTime string
End time (e.g., "8:30 PM" or "20:30")
timezone string
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)
location string
Location override or additional directions
latitude number
Map latitude (overrides venue/customVenue)
longitude number
Map longitude (overrides venue/customVenue)
coordFrequency string
Radio frequency for on-site coordination (e.g., "146.580")

Online

onlineMeeting string
Meeting key from site.config.ts (e.g., "microhams-teams")
teams object
Direct Teams meeting details (if not using config key)
virtualLink string
Meeting URL for other platforms (Zoom, etc.)

Metadata

eventType "meeting" | "conference" | "field-day" | "contest" | "social" | "workshop" | "external" = "meeting"
Event category for filtering and display
registrationRequired boolean = false
If true, shows registration info
registrationLink string
URL to registration form
contactPerson string
Event contact name and callsign
contactEmail string
Event contact email
showDisclaimer boolean = true
If true, shows recording/privacy notice for online meetings

Images

cover string
Cover image path (relative, e.g., ./cover.jpg)
coverAlt string
Alt text for cover image (required if cover is set)

Publishing

updated string
Last update date (YYYY-MM-DD)
publishDate string
Scheduled publish date (YYYY-MM-DD)

Other

customVenue object
One-off venue (use instead of venue key for non-recurring locations)
eventLink string
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

title string required
Page or content title
description string
Brief summary for SEO and previews
author string
Author name and callsign (e.g., "Jane Smith, W1ABC")
date string
Publication date (YYYY-MM-DD)
updated string
Last update date (YYYY-MM-DD)
draft boolean = false
If true, excluded from production builds
publishDate string
Scheduled publish date (YYYY-MM-DD)
featured boolean = false
If true, highlighted in listings
tags string[] = []
Lowercase, hyphenated keywords for filtering
cover string
Cover image path (relative, e.g., ./cover.jpg)
coverAlt string
Alt text for cover image (required if cover is set)
layout "default" | "full-width" | "minimal" = "default"
Page layout variant
hideHeader boolean = 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 versionsdiagram.svg and diagram-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"