4.0 KiB
Content Guide
How to add and edit content on the site. Two sections use Content Collections
(typed markdown/MDX); the interest pages are hand-built .astro files.
Projects (Professional page)
Projects render from src/content/projects/*.md (or .mdx). Each file is one
project card. The schema lives in src/content.config.ts.
Add a project
Create src/content/projects/my-project.md:
---
title: 'My Awesome Project'
role: 'Lead Developer' # optional, default: 'Developer'
tech: ['TypeScript', 'Node.js', 'SAP BTP'] # rendered as pills
summary: 'A 2-3 sentence description of what it does and your contribution.'
repo: 'https://github.com/you/repo' # optional
demo: 'https://demo.example.com' # optional
caseStudy: 'https://blog.example.com' # optional
cover: '/images/my-project.png' # optional, public path
order: 20 # lower = shown first, default 100
placeholder: false # true hides it from "real" styling
---
Optional longer writeup in markdown here. The card only shows `summary`, but you
can link to a case study for depth.
Field reference
| Field | Type | Required | Notes |
|---|---|---|---|
title |
string | yes | Project name |
role |
string | no | e.g. "Lead Developer" |
tech |
string[] | no | Tag pills |
summary |
string | yes | Short card description |
repo / demo / caseStudy |
URL | no | Outbound links |
cover |
string | no | Image path in public/ |
order |
number | no | Sort weight |
placeholder |
boolean | no | Marks it as a TODO card |
To remove the seed placeholder, delete placeholder-project.md. Aim for 3-6 real
entries per the spec.
Experience (Professional timeline)
Experience renders from src/content/experience/*.md. Each file is one role on
the vertical timeline.
Add a role
Create src/content/experience/another-role.md:
---
company: 'Previous Co.'
title: 'Junior Developer'
period: '2016 - 2020' # free-form date label
focus: 'What you primarily did.' # optional
icon: 'briefcase' # mdi icon name for the marker
order: 20 # lower = more recent / first
---
- Bullet point of an accomplishment.
- Another bullet, ideally with a metric.
- One more, showing impact.
The body renders inside an expandable "Show details" panel. Use markdown lists
for bullets. Replace the bracketed placeholders in the seed implico.md with
real outcomes, metrics, and dates.
Icon names
The icon field takes an mdi name without the mdi: prefix. Browse names at
pictogrammers.com or search the
installed set:
node -e "const m=require('./node_modules/@iconify-json/mdi/icons.json'); console.log(Object.keys(m.icons).filter(n=>n.includes('cloud')).join('\n'))"
Interest pages
Each interest is a hand-built page in src/pages/interests/. They follow the
spec's template: Header (title + tagline), Overview (narrative),
Highlights (card grid), Currently (active now), Related (cross-links).
To edit content, open the relevant .astro file and change the copy in the
frontmatter arrays or the section bodies. To add a new interest:
- Create
src/pages/interests/my-interest.astro(copy an existing page as a template). - Use
<BaseLayout surface="interest">,<InterestHero>,<InterestCard>, and<RelatedInterests>. - Add a card for it in
src/pages/interests/index.astro(the hub).
Global content (nav, socials, tagline)
Edit src/lib/site.ts:
siteIdentity— name, tagline, domainnavGroups— the two-group top navsocials— footer + contact links (replace the[Greg to fill]handles)
Finding placeholders
Every [Greg to fill] gap from the spec is rendered as a styled Placeholder
slot (dashed border + pencil badge + "TODO · label"). To find them all:
grep -rn "Placeholder label" src/
grep -rn "Greg to fill\|\[Greg" src/
Replace each with real content as you gather it.