Skip to content
New: Customize your theme with an AI assistant. Read the guide

Collections

Files: src/content/<collection>/english/ (and french/), src/content.config.ts · Skill level: Beginner

A collection is a folder of similar entries. Each file is one entry and usually one page, and -index.md holds the list page. Add an entry by copying an existing file, renaming it (the file name becomes the URL), and editing it. Every sample file says in its first comment that its content is a sample to replace.

The fields each collection accepts are defined in src/content.config.ts, and npm run astro-check reports a wrong field type or value.

CollectionFolderPages
Blogsrc/content/blog//blog/, one page per post, category and tag pages, RSS
Authorssrc/content/author/The author box under posts (no pages)
Changelogsrc/content/changelog//changelog/, one page per release, tag pages, RSS
Integrationssrc/content/integrations//integrations/ and one page per tool
Solutionssrc/content/solutions//solutions/ and one page per team
Templatessrc/content/templates//templates/ and one page per template
Careerssrc/content/careers//careers/ and one page per role
FAQsrc/content/faq//faq/
Helpsrc/content/help//help/
Statussrc/content/status//status/
Pagessrc/content/pages/One text page per file (legal pages)
Authsrc/content/auth//login/, /signup/, /forgot-password/

Blog

---
title: "The two-list method for a calmer workday"
description: "One list for today, one for everything else." # intro, card excerpt, meta description
image: "/images/blog/two-lists.svg" # cover: 16:9 on the post, 3:2 on cards
date: 2026-09-10
# updated: 2026-10-20 # shown as "Updated" when later than date
author: "Omar Haddad" # links to src/content/author/english/omar-haddad.md
# featured: true # the large card at the top of /blog/ (otherwise the newest post)
categories: ["Productivity"] # first one is the pill; each gets /blog/category/<name>/
tags: ["focus", "prioritization"] # each gets /blog/tag/<name>/
draft: false
---
The article, in Markdown.
  • Posts are listed newest first, blogPagination per page (config.toml).
  • blog-posts-section.md sets the featured card, the category pills (filter), and a color per category (categoryColors).
  • related-articles-section.md sets the “Related articles” cards under each post, picked by shared categories and tags.
  • Each language has an RSS feed: /blog/rss.xml and /fr/blog/rss.xml.
  • Posts can be .mdx to use shortcodes. See Writing Content.

Authors

One file per author in src/content/author/english/. A post’s author: "Omar Haddad" is matched to omar-haddad.md (the name in lowercase, with dashes).

title: "Omar Haddad" # full name
role: "Product lead"
image: "/images/team/5.png" # round photo; initials without one
description: "..." # bio in the author box; the box is hidden when empty
links:
- { label: "LinkedIn", url: "https://www.linkedin.com/in/..." }

Changelog

---
title: "Recurring tasks"
date: 2026-10-06 # releases are listed newest first
version: "Version 2.8.0" # the sun pill
tags: ["New"] # any text: New, Improved, Fixed…; each gets /changelog/tag/<tag>/
description: "..." # intro on the release page
highlights: # bullet points on the release card
- "Repeat any task daily, weekly, monthly, or on custom days."
draft: false
---
The release notes, in Markdown.

release-notes-section.md sets the tag filter and a color per tag (tagColors, for example New: "lime"). pagination in config.toml sets how many releases a list page shows. RSS: /changelog/rss.xml.

Integrations

---
title: "Chatnest"
description: "Turn chat messages into tasks."
icon: "MessageSquare" # a Lucide name, or an image path such as "/images/icons/github.svg"
color: "lilac" # tile: sun | lime | sky | lilac | orchid | mint | lemon
# logo: "/images/your-logo.svg" # optional SVG mark instead of the icon
category: "Communication" # groups the directory
developer: "Acme"
website: "https://..."
docs: "/contact/" # setup guide: details row and hero button
featured: false # listed first, with a badge
information: # extra rows in the details card
- { label: "Plans", value: "All plans" }
related: ["daybook", "pagewise"] # defaults to the same category
draft: false
---
The integration page text, in Markdown.

The directory groups entries by category, in the order of groups in integrations-catalog-section.md (categories not listed follow, titled with their name). Shared labels and the hero card of the detail pages are in integration-detail-section.md. The sample tools are fictional.

Solutions

One entry per team, shown as a card on /solutions/ and as its own page. A solution page is built entirely from the named blocks in its file: pageHeader, comparisonSection, featureRowsSection, stepsSection, testimonialsSection (first three reviews), and faqSection.

---
team: "Marketing" # card title, menu label, last breadcrumb
title: "Campaigns that launch on *time*"
description: "Plan campaigns, content, and launches on one calendar."
icon: "Megaphone"
color: "sun"
points: ["One calendar for every campaign", "Review steps with clear owners"]
weight: 1 # order on /solutions/
pageHeader: { ... }
comparisonSection: { ... }
featureRowsSection: { ... }
---

Copy an existing solution file to add a team; the sections fall back to their section files for anything you leave out.

Templates

---
title: "Bug triage"
description: "Collect every bug in one queue, sort it by impact, and send it to the right person."
category: "Product and engineering" # groups the gallery and picks related templates
view: "board" # coded preview: board | list | calendar | timeline
color: "lilac"
icon: "Bug"
taskCount: 15 # "{count} tasks" on the card
audience: ["Engineering and support teams sharing one bug queue"]
columns: # "What's inside": lists with example tasks
- name: "New"
color: "lilac"
tasks: ["Export button does nothing", "Typo on the pricing page"]
related: ["sprint-planning", "product-launch"]
weight: 3 # order in the gallery
draft: false
---

The preview on the card and the template page is drawn from view and columns, so there is no image to make. Gallery groups and the category links are set in templates-catalog-section.md; the labels and buttons of the template pages in template-detail-section.md.

Careers

---
title: "Backend Engineer, Sync"
description: "Keep every task, comment, and file in sync."
date: 2026-10-01 # posting date
department: "Engineering" # groups /careers/ (departments in careers-list-section.md)
workplace: "hybrid" # remote | hybrid | onsite
location: "Lisbon"
type: "full-time" # full-time | part-time | contract | internship
salary: "€60k – €78k per year"
salaryRange: { min: 60000, max: 78000, currency: "EUR", unit: "YEAR" }
# applyUrl: "https://jobs.example.com/backend" # defaults to the button in career-detail-section.md
# countries: [] # where remote candidates can live
# validThrough: 2026-12-31 # last day to apply
weight: 2
draft: false
---
The role description, in Markdown.

Each role page adds JobPosting structured data from these fields, so job search engines can list it. The sample roles are fictional: delete them or replace them with real openings before launch. Department order, headings, and filter chips are in careers-list-section.md; the apply button and “other roles” block in career-detail-section.md.

FAQ

/faq/ shows the FAQ section in the grouped layout. The questions live in src/content/sections/english/faq-section.md: groups (topics, each with a title, Lucide icon, color, and items) for /faq/, and items for the FAQ on the homepages and other pages. src/content/faq/english/-index.md holds the page title, page header, and the faqSection block (layout, jsonLd: true for FAQPage structured data).

Help

src/content/help/english/-index.md holds the page header, the search box (search), and the help card at the bottom (contact). The categories and article lists are in help-categories-section.md and popular-articles-section.md; their links ship as # placeholders.

The search box opens the site search window (⌘K) with the visitor’s words filled in. Without JavaScript, or with site search turned off, the form sends the words as ?q= to search.action, so you can point it at your documentation’s search page instead.

Status Page

/status/ is a static page you update by hand (or from your monitoring tool). All its data is in src/content/sections/english/status-section.md, and it is sample data:

components:
- name: "API"
description: "Public API and webhooks"
status: "operational" # operational | degraded | outage | maintenance
uptime: "99.94%" # leave it out to compute it from history
# one letter per day, oldest first: o operational, d degraded, x outage, m maintenance, - no data
history: "oooooooooo oooooooooo oooooooooo ..."
incidents:
items:
- date: 2026-10-16
title: "Delayed push notifications"
status: "resolved" # investigating | identified | monitoring | resolved | scheduled | completed
components: ["Notifications"]
updates:
- { status: "resolved", time: "15:42 UTC", text: "..." }
  • The banner and the footer status link show the worst current status of all components.
  • days sets the length of the uptime bars (phones show the last 30 days).
  • Spaces in history are ignored; groups of ten are easier to read.
  • Not running a status page? Set draft: true in src/content/status/english/-index.md: the page is not built and the footer link disappears.

Pages And Auth

  • Pages (src/content/pages/): text pages such as the legal pages. See Pages.
  • Auth (src/content/auth/): the log-in, sign-up, and password screens: form (with action, fields, and submitLabel), social providers, the aside panel, and options.layout. The theme has no account system: point form.action at your app.

Do It With AI

Add [N] integrations to src/content/integrations/english/ for these tools: [NAMES AND ONE-LINE
DESCRIPTIONS]. Copy the frontmatter shape of chatnest.md: icon (a Lucide name), color, category
(one of the groups in integrations-catalog-section.md), developer, website, docs, and a short
Markdown body. Then add the French versions with the same file names, and delete the sample
integrations I don't keep: [LIST].
Type something to search...