Managing Projects
Projects are stored in src/content/projects/ as Markdown or MDX files, organized by locale.
Folder Structure
src/content/projects/
├── en/ ← English (default)
│ ├── autonomous-rover.mdx
│ └── ...
└── de/ ← German translations
├── autonomous-rover.mdx
└── ...
Both folders use identical filenames. If a German translation is missing, the English version is displayed on the /de/ pages.
Creating a Project
Create a new file in src/content/projects/en/ (or de/ for German). The filename becomes the slug — use a short, URL-safe title (e.g. autonomous-rover.mdx). Sort order on the projects page is driven by the date frontmatter field, not the filename.
---
title: "Autonomous Rover Prototype"
description: "An AI-powered rover with autonomous navigation, computer vision, and obstacle avoidance."
date: 2025-11-20
categoryProject: "robotics"
coverImage: /autonomous-rover/cover.jpg
isProjectCompleted: false
isDraft: false # Optional — defaults to false, set true to hide from production
displayMeetTheTeam: true # Optional — show this project in the homepage "Meet the Team" section
person: "emma-watson" # Optional — required when displayMeetTheTeam is true; slug of an entry in src/content/people/
---
import { Accordion, Button, Callout, Carousel, Center, ImageGrid, Img, Instagram, Marquee, YouTube, SideBySide, Left, Right } from '@mdx';
## Project Overview
<Callout title="Status: In Progress">
Currently in the testing phase — stay tuned for updates!
</Callout>
The Autonomous Rover Prototype focuses on developing advanced navigation
algorithms for a Mars rover-inspired vehicle. Our goal is a fully
autonomous system capable of navigating challenging terrain while avoiding
obstacles and achieving mission objectives.
Required Fields
| Field | Type | Description |
|---|---|---|
title | string | Project title |
description | string | Short summary shown on cards |
date | date | Project date (YYYY-MM-DD) |
categoryProject | enum | One of: experimental-rocketry, science-and-experiments, robotics, other |
coverImage | string | Path to cover image under src/assets/projects/<slug>/, written as /<slug>/<filename> |
isProjectCompleted | boolean | Set to true when the project is finished |
Optional Fields
| Field | Type | Description |
|---|---|---|
isDraft | boolean | Set to true to hide in production (default: false) |
displayMeetTheTeam | boolean | Show this project in the homepage “Meet the Team” section |
person | reference | Slug of a person in src/content/people/ who leads this project (required if displayMeetTheTeam is true) |
coverImageDescription | string | Caption shown over the cover image on /media. Use it for any combination of caption and photographer credit. Leave blank to show no caption. Inline <Img /> blocks in the project body are also pulled into the Projects accordion on /media — each block has its own displayInMedia toggle (default on, flip off to keep that image post-only). |
Cover Images
Each project has its own asset subfolder under src/assets/projects/<slug>/, where <slug> matches the filename (without extension). Place the cover image and any inline MDX images there. The coverImage frontmatter is written as /<slug>/<filename> (e.g. /autonomous-rover/cover.jpg). Valid formats: .jpg, .jpeg, .png, .webp, .svg.
Meet the Team
If you set displayMeetTheTeam: true, you must also reference a person via the person field. The build will fail if person is missing or doesn’t resolve to a real entry under src/content/people/.
In the Keystatic admin, the Head of project field is a dropdown populated from the People collection — pick the person there. If they don’t exist yet, create them in the People group first. See Managing People for the people schema.
The same person record powers both the Faces of BEARS grid (when showInFaces: true) and the project Meet the Team callout — name, role, and photo come from the people entry, not from the project.