src/content.config.ts. The portfolio uses Astro’s Content Collections API with Zod schemas for type-safe content management.
Overview
The content configuration defines 11 collections with strict type validation using Zod schemas. Collections are split between data loaders (JSON files) and content-type collections (MDX files).Collection Types
- Data Collections
- Content Collections
Collections that use the
file() loader to load data from JSON files:- socials - Social media links
- books - Book recommendations
- techStack - Technology stack items
- desktopSetup - Desktop setup gear
Data Collections
Socials Collection
Social media profiles and external links.string
required
Unique identifier for the social platformExample:
"twitter", "github", "linkedin"string
required
Display name of the social platformExample:
"Twitter", "GitHub", "LinkedIn"string (URL)
required
Full URL to the social profile. Must be a valid URL format.Example:
"https://twitter.com/lewiskori"Validation: z.string().url()string
required
Icon identifier for displaying the platform iconExample:
"twitter", "github-alt", "linkedin-in"string
required
Accessibility label for screen readersExample:
"Follow me on Twitter", "View my GitHub profile"Books Collection
Recommended books and reading list.string
required
Unique identifier for the bookExample:
"atomic-habits", "zero-to-one"string
required
Full title of the bookExample:
"Atomic Habits", "Zero to One"string
required
Author name(s)Example:
"James Clear", "Peter Thiel"string
required
Path or URL to the book cover imageExample:
"/images/books/atomic-habits.jpg"string
required
Brief description or review of the bookExample:
"Practical strategies for building good habits and breaking bad ones"string
required
Link to purchase or learn more about the bookExample:
"https://amzn.to/..."Tech Stack Collection
Technologies and tools used in development.string
required
Unique identifier for the technologyExample:
"astro", "typescript", "tailwind"string
required
Display name of the technologyExample:
"Astro", "TypeScript", "Tailwind CSS"string
required
Path or URL to the technology logoExample:
"/images/tech/astro.svg"string
required
Brief description of how the technology is usedExample:
"Static site generation framework"string (URL)
required
Official website or documentation URLExample:
"https://astro.build"Validation: z.string().url()Desktop Setup Collection
Physical desk setup and equipment.string
required
Unique identifier for the itemExample:
"monitor", "keyboard", "desk"string
required
Product nameExample:
"Dell UltraSharp 27\"", "Keychron K2"string
required
Path or URL to product imageExample:
"/images/setup/monitor.jpg"string
required
Description of the product and why it’s usedExample:
"4K monitor for development work"string
required
Purchase link or product pageExample:
"https://amzn.to/..."Content Collections
About Collection
About page content without schema validation.none
No schema defined - allows flexible frontmatterContent Type: MDX/Markdown files in
src/content/about/Operating Notes Collection
Personal operating principles and work philosophy.string
required
Title of the operating noteExample:
"How I Work", "Communication Guidelines"string
required
Subtitle or tagline for the noteExample:
"Principles for effective collaboration"string
required
Brief description for SEO and previewsExample:
"My approach to async communication and deep work"Date
required
Last modification dateFormat: ISO date string (coerced to Date object)Example:
"2024-03-15" → Date objectValidation: z.coerce.date()Advisory Collection
Advisory services and consulting information.string
required
Title of the advisory service or pageExample:
"Technical Advisory", "Product Strategy"string
required
Subtitle describing the serviceExample:
"Help scaling your technical organization"string
required
Detailed description for SEOExample:
"Strategic technical advice for growing companies"Date
required
Last modification dateValidation:
z.coerce.date()string
Optional featured image for the advisory pageExample:
"/images/advisory/hero.jpg"Blog Collection
Blog posts and articles.string
required
Blog post titleExample:
"Building Scalable Systems"string
required
Author nameExample:
"Lewis Kori"string[]
required
Array of tag strings for categorizationExample:
["python", "web-development", "api"]Validation: z.array(z.string())string
required
Post summary for SEO and previewsExample:
"Learn how to build scalable backend systems"Date
required
Publication dateValidation:
z.coerce.date()string
Optional cover image pathExample:
"/images/blog/post-cover.jpg"string
Optional series name if post is part of a seriesExample:
"Django REST Framework Tutorial"string[]
Optional array of sponsor IDs for the postExample:
["sponsor-1", "sponsor-2"]Validation: z.array(z.string())string (URL)
Optional canonical URL if post was published elsewhere firstExample:
"https://dev.to/lewiskori/..."Validation: z.string().url()Experience Collection
Professional work experience entries.string
required
Company or organization nameExample:
"Acme Corp", "Self-employed"string (URL)
required
Company website URLExample:
"https://acmecorp.com"Validation: z.string().url()string
required
Job title or roleExample:
"Senior Software Engineer", "CTO"string
required
Employment period as a stringExample:
"Jan 2020 - Present", "2018-2020"number
required
Numeric order for sorting (lower numbers first)Example:
1, 2, 3Usage: Used to control display order of experience entriesProjects Collection
Portfolio projects showcase.string
required
Project nameExample:
"E-commerce Platform", "API Gateway"string[]
required
Array of technologies usedExample:
["React", "Node.js", "PostgreSQL"]Validation: z.array(z.string())string (URL)
Optional live project URLExample:
"https://project.com"Validation: z.string().url()string (URL)
Optional GitHub repository URLExample:
"https://github.com/user/repo"Validation: z.string().url()string (URL)
Optional iOS App Store URLExample:
"https://apps.apple.com/..."Validation: z.string().url()string (URL)
Optional Google Play Store URLExample:
"https://play.google.com/store/apps/..."Validation: z.string().url()string
Optional project cover imageExample:
"/images/projects/project-cover.jpg"boolean
Whether to feature this project prominentlyExample:
true, falseDefault: false (if not specified)number
required
Year the project was completed or launchedExample:
2024, 2023string
Optional company or context where project was madeExample:
"Acme Corp", "Personal Project"Sponsors Collection
Site sponsors and supporters.string
required
Sponsor name or companyExample:
"Acme Corp", "John Doe"string (URL)
required
Sponsor website URLExample:
"https://sponsor.com"Validation: z.string().url()string (URL)
Optional Twitter/X profile URLExample:
"https://twitter.com/sponsor"Validation: z.string().url()string
Optional sponsor logo pathExample:
"/images/sponsors/logo.svg"string
required
Brief description of the sponsorExample:
"Building the future of developer tools"boolean
required
Whether to feature this sponsor prominentlyExample:
true, falseComplete Schema Definition
Usage Example
Query content collections in your Astro pages:Type Safety
All schemas provide full TypeScript type safety:Related Configuration
- Astro Configuration - Core Astro framework settings
- Site Configuration - Site metadata and personal information