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.
| Collection | Folder | Pages |
|---|---|---|
| Blog | src/content/blog/ | /blog/, one page per post, category and tag pages, RSS |
| Authors | src/content/author/ | The author box under posts (no pages) |
| Changelog | src/content/changelog/ | /changelog/, one page per release, tag pages, RSS |
| Integrations | src/content/integrations/ | /integrations/ and one page per tool |
| Solutions | src/content/solutions/ | /solutions/ and one page per team |
| Templates | src/content/templates/ | /templates/ and one page per template |
| Careers | src/content/careers/ | /careers/ and one page per role |
| FAQ | src/content/faq/ | /faq/ |
| Help | src/content/help/ | /help/ |
| Status | src/content/status/ | /status/ |
| Pages | src/content/pages/ | One text page per file (legal pages) |
| Auth | src/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 descriptionimage: "/images/blog/two-lists.svg" # cover: 16:9 on the post, 3:2 on cardsdate: 2026-09-10# updated: 2026-10-20 # shown as "Updated" when later than dateauthor: "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,
blogPaginationper page (config.toml). blog-posts-section.mdsets the featured card, the category pills (filter), and a color per category (categoryColors).related-articles-section.mdsets the “Related articles” cards under each post, picked by shared categories and tags.- Each language has an RSS feed:
/blog/rss.xmland/fr/blog/rss.xml. - Posts can be
.mdxto 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 namerole: "Product lead"image: "/images/team/5.png" # round photo; initials without onedescription: "..." # bio in the author box; the box is hidden when emptylinks: - { label: "LinkedIn", url: "https://www.linkedin.com/in/..." }Changelog
---title: "Recurring tasks"date: 2026-10-06 # releases are listed newest firstversion: "Version 2.8.0" # the sun pilltags: ["New"] # any text: New, Improved, Fixed…; each gets /changelog/tag/<tag>/description: "..." # intro on the release pagehighlights: # 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 iconcategory: "Communication" # groups the directorydeveloper: "Acme"website: "https://..."docs: "/contact/" # setup guide: details row and hero buttonfeatured: false # listed first, with a badgeinformation: # extra rows in the details card - { label: "Plans", value: "All plans" }related: ["daybook", "pagewise"] # defaults to the same categorydraft: 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 breadcrumbtitle: "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 templatesview: "board" # coded preview: board | list | calendar | timelinecolor: "lilac"icon: "Bug"taskCount: 15 # "{count} tasks" on the cardaudience: ["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 gallerydraft: 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 datedepartment: "Engineering" # groups /careers/ (departments in careers-list-section.md)workplace: "hybrid" # remote | hybrid | onsitelocation: "Lisbon"type: "full-time" # full-time | part-time | contract | internshipsalary: "€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 applyweight: 2draft: 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
statusof all components. dayssets the length of the uptime bars (phones show the last 30 days).- Spaces in
historyare ignored; groups of ten are easier to read. - Not running a status page? Set
draft: trueinsrc/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(withaction,fields, andsubmitLabel), socialproviders, theasidepanel, andoptions.layout. The theme has no account system: pointform.actionat your app.
Do It With AI
Add [N] integrations to src/content/integrations/english/ for these tools: [NAMES AND ONE-LINEDESCRIPTIONS]. 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 shortMarkdown body. Then add the French versions with the same file names, and delete the sampleintegrations I don't keep: [LIST].