This guide walks you through customizing every aspect of your portfolio template.
- Configuration File
- Personal Information
- Hero Section
- About Section
- Services
- Career Timeline
- Social Links
- Site Metadata
- Navigation
- Contact Page
- Skills (via Admin)
- Projects (via Admin)
- Styling & Theming
- Environment Variables
All content customization happens in portfolio.config.ts. This single file controls:
- Your personal information displayed throughout the site
- Hero section content
- About page text and statistics
- Services/expertise you offer
- Career timeline
- Social media links
- Site metadata (SEO)
- Navigation structure
- Contact page content
# Start with the sample configuration
cp portfolio.config.sample.ts portfolio.config.ts
# Edit with your preferred editor
code portfolio.config.tsThe personal section is used across multiple pages:
personal: {
name: "Alex Johnson", // Full name
firstName: "Alex", // First name only (for greetings)
email: "alex@example.com", // Contact email
location: "San Francisco, CA", // Your location
title: "Full Stack Developer", // Professional title
tagline: "Building digital experiences that matter",
}Where it appears:
- About page header
- Contact page information
- Email links
The hero section is the main landing area:
hero: {
badge: "Full Stack Developer", // Small badge above headline
headline: ["Building", "Digital", "Experiences"], // Three words (middle is gradient)
description: "Your 2-3 sentence introduction...",
primaryCta: {
text: "View My Work",
href: "/portfolio",
},
secondaryCta: {
text: "Get in Touch",
href: "/contact",
},
}Tips:
- Keep the headline to 3 short words for best visual impact
- The middle word automatically gets the gradient effect
- Description should be 2-3 sentences max
Configure your introduction and stats:
about: {
introduction: "A longer paragraph about yourself...",
stats: [
{
label: "Years Experience",
value: 5,
suffix: "+",
icon: "Zap", // Lucide icon name
color: "text-primary",
},
// Add up to 4 stats
],
}Available Icons: Browse icons at lucide.dev/icons. Common choices:
Zap- ExperienceCode2- ProjectsUsers- ClientsLayers- TechnologiesGraduationCap- Education
Available Colors:
text-primary- Purple/violettext-secondary- Cyantext-accent- Greentext-chart-4- Orangetext-chart-5- Pink
Define your services/expertise (4-6 recommended):
services: [
{
icon: "Code2",
title: "Web Development",
description: "Brief description of this service...",
gradient: "from-primary/20 to-primary/5",
iconColor: "text-primary",
},
// Add more services
]Gradient Options:
"from-primary/20 to-primary/5" // Purple
"from-secondary/20 to-secondary/5" // Cyan
"from-accent/20 to-accent/5" // Green
"from-chart-4/20 to-chart-4/5" // Orange
"from-chart-5/20 to-chart-5/5" // Pink
"from-primary/20 to-accent/5" // Purple to greenAdd your professional journey (most recent first):
timeline: [
{
year: "2023 - Present",
title: "Senior Developer @ Company",
description: "What you accomplished in 1-2 sentences.",
type: "leadership", // Controls icon and color
},
// Add more events
]Event Types:
| Type | Icon | Use Case |
|---|---|---|
leadership |
Users | Management, leadership roles |
development |
Code | Developer positions, projects |
education |
GraduationCap | Degrees, certifications |
milestone |
Rocket | Achievements, awards |
All social links are optional:
social: {
github: "https://github.com/yourusername",
linkedin: "https://linkedin.com/in/yourusername",
twitter: "https://twitter.com/yourusername",
website: "https://yourwebsite.com", // Personal site
}Note: If a link is omitted, it won't appear in the UI.
SEO and branding settings:
site: {
title: "Alex Johnson | Full Stack Developer", // Browser tab
description: "Portfolio description for search engines (150 chars).",
logoText: "Portfolio", // Text in navigation logo
}SEO Tips:
- Keep title under 60 characters
- Description should be 150-160 characters
- Include relevant keywords naturally
Usually you don't need to change this:
navigation: {
items: [
{ href: "/", label: "Home" },
{ href: "/about", label: "About" },
{ href: "/portfolio", label: "Portfolio" },
{ href: "/contact", label: "Contact" },
],
ctaButton: {
text: "Let's Talk",
href: "/contact",
},
}Customize the contact page content:
contact: {
heading: "Let's Connect",
subheading: "Have a project in mind? I'd love to hear from you...",
responseTime: "I typically respond within 24-48 hours.",
}Skills are managed through the admin dashboard at /admin:
- Log in with your
ADMIN_PASSWORD - Navigate to Skills section
- Add/edit/delete skills
Or seed sample data:
npm run db:seed-sampleSkills have:
- Name - Skill name (e.g., "React")
- Category - Grouping (e.g., "Development", "Tools")
- Proficiency - Percentage 0-100
Projects are also managed in the admin dashboard:
- Manual Entry: Add projects with title, description, image, technologies
- GitHub Sync: Import all public repositories automatically
# In .env file
GITHUB_USERNAME=yourusername
GITHUB_TOKEN=your_personal_access_tokenThen use "Sync GitHub" in the admin dashboard.
Colors are defined in client/src/index.css. The default theme uses:
| Variable | Description |
|---|---|
--primary |
Main accent (purple) |
--secondary |
Secondary accent (cyan) |
--accent |
Tertiary accent (green) |
--background |
Page background |
--foreground |
Main text color |
Add custom styles to client/src/index.css:
/* Add your custom styles at the bottom */
.my-custom-class {
/* ... */
}The default font is system UI. To change:
- Add font import to
client/index.html - Update font-family in
client/src/index.css
Required for full functionality:
# Required
DATABASE_URL=postgresql://...
JWT_SECRET=your-64-char-secret
ADMIN_PASSWORD=your-password
# Recommended
GITHUB_USERNAME=yourusername
GITHUB_TOKEN=your-token
# Optional
GEMINI_API_KEY=for-image-generation
GOOGLE_ANALYTICS_ID=UA-xxxxxSee .env.template for full documentation.
Before deploying, ensure you've:
- Updated
portfolio.config.tswith your information - Set all required environment variables
- Added your skills in admin dashboard
- Added at least 3-5 projects
- Tested all pages locally
- Verified contact form works
- Check DEPLOYMENT.md for deployment guides
- Check ADMIN_GUIDE.md for admin dashboard help
- Open an issue on GitHub for bugs or questions