Appearance
Collections
Collections are the content types in Portfolio CMS. Each collection stores a specific type of data that appears on your portfolio.
Overview
| Collection | Purpose | Key Fields |
|---|---|---|
| Users | Admin accounts | Email, password, roles |
| Media | File uploads | File, alt text, dimensions |
| Categories | Project grouping | Name, slug, color |
| Projects | Portfolio items | Title, description, images, tech stack |
| Skills | Technical abilities | Name, category, proficiency |
| Experience | Work history | Company, role, dates |
| Education | Academic history | Institution, degree, dates |
| Achievements | Awards/certs | Title, issuer, date |
| Testimonials | Client feedback | Quote, author, rating |
| Companies | Client logos | Name, logo, website |
| Messages | Contact submissions | Name, email, message |
Projects
The main collection for showcasing your work.
Fields
| Field | Type | Description |
|---|---|---|
title | Text | Project name (required) |
slug | Text | URL-friendly identifier |
description | Textarea | Brief overview |
content | Rich Text | Detailed write-up |
featuredImage | Upload | Main project image |
gallery | Array | Additional screenshots |
category | Relationship | Link to Categories |
technologies | Array | Tech stack used |
liveUrl | Text | Demo/live site link |
repoUrl | Text | Source code link |
featured | Checkbox | Show on homepage |
order | Number | Display order |
Usage Example
typescript
// Fetch featured projects
const projects = await payload.find({
collection: 'projects',
where: {
featured: { equals: true },
},
sort: 'order',
limit: 6,
})Skills
Technical skills and expertise.
Fields
| Field | Type | Description |
|---|---|---|
name | Text | Skill name (required) |
category | Select | Frontend, Backend, DevOps, etc. |
proficiency | Number | 1-100 scale |
yearsOfExperience | Number | Years using this skill |
icon | Select | Icon to display |
featured | Checkbox | Highlight this skill |
order | Number | Display order |
Categories
- Frontend
- Backend
- Database
- DevOps
- Mobile
- Tools
- Other
Experience
Work history and professional experience.
Fields
| Field | Type | Description |
|---|---|---|
company | Text | Company name (required) |
position | Text | Job title (required) |
companyLogo | Upload | Company logo |
companyUrl | Text | Company website |
location | Text | Job location |
startDate | Date | Employment start |
endDate | Date | Employment end (if applicable) |
current | Checkbox | Currently employed here |
description | Rich Text | Role overview |
responsibilities | Array | List of duties |
achievements | Array | Notable accomplishments |
technologies | Array | Tech used in role |
Education
Academic background and certifications.
Fields
| Field | Type | Description |
|---|---|---|
institution | Text | School/university name |
degree | Text | Degree/certificate earned |
fieldOfStudy | Text | Major/concentration |
institutionLogo | Upload | Institution logo |
location | Text | Institution location |
startDate | Date | Start date |
endDate | Date | Graduation date |
current | Checkbox | Currently enrolled |
gpa | Text | GPA (optional) |
description | Rich Text | Additional details |
achievements | Array | Honors, awards |
Achievements
Awards, certifications, and accomplishments.
Fields
| Field | Type | Description |
|---|---|---|
title | Text | Achievement name (required) |
type | Select | Award, Certification, Publication, etc. |
issuer | Text | Issuing organization |
date | Date | Date received |
description | Textarea | Details about the achievement |
credentialUrl | Text | Verification link |
credentialId | Text | Certificate/credential ID |
image | Upload | Badge or certificate image |
featured | Checkbox | Highlight this achievement |
Testimonials
Client feedback and recommendations.
Fields
| Field | Type | Description |
|---|---|---|
quote | Textarea | The testimonial text (required) |
authorName | Text | Client/author name (required) |
authorTitle | Text | Their job title |
authorCompany | Text | Their company |
authorImage | Upload | Profile photo |
rating | Number | 1-5 star rating |
projectRef | Relationship | Related project |
featured | Checkbox | Show on homepage |
order | Number | Display order |
Companies
Clients, employers, or partners to display as logos.
Fields
| Field | Type | Description |
|---|---|---|
name | Text | Company name (required) |
logo | Upload | Company logo (required) |
website | Text | Company website |
featured | Checkbox | Show on homepage |
order | Number | Display order |
Messages
Contact form submissions.
Fields
| Field | Type | Description |
|---|---|---|
name | Text | Sender name |
email | Sender email | |
subject | Text | Message subject |
message | Textarea | Message content |
status | Select | Unread, Read, Replied, Archived |
createdAt | Date | Submission timestamp |
Workflow
- User submits contact form
- Message appears in admin with "Unread" status
- Admin views message (status changes to "Read")
- Admin can mark as "Replied" or "Archived"
Categories
For organizing projects.
Fields
| Field | Type | Description |
|---|---|---|
name | Text | Category name (required) |
slug | Text | URL-friendly identifier |
description | Textarea | Category description |
color | Text | Display color (hex) |
order | Number | Display order |
Media
File and image uploads.
Features
- Automatic image optimization
- Alt text for accessibility
- Dimensions stored automatically
- S3 storage integration
- 10MB file size limit
Supported Types
- Images: JPEG, PNG, GIF, WebP, SVG
- Documents: PDF
Data Fetching
From Server Components
typescript
import { getPayload } from 'payload'
import config from '@payload-config'
export default async function Page() {
const payload = await getPayload({ config })
const { docs: projects } = await payload.find({
collection: 'projects',
where: { featured: { equals: true } },
limit: 6,
})
return <ProjectsGrid projects={projects} />
}Using Helper Functions
typescript
import { getProjects, getSkills, getExperience } from '@/lib/payload'
// In a Server Component
const [projects, skills, experience] = await Promise.all([
getProjects({ featured: true, limit: 6 }),
getSkills(),
getExperience(),
])