A modern, responsive, and fully configurable portfolio template built with Next.js 16, TypeScript, and Tailwind CSS. Perfect for developers, designers, and professionals who want to showcase their work beautifully.
- Dark/Light mode with smooth transitions and WCAG-compliant colors
- Multilingual (EN, PT, ES) with automatic content fallbacks
- File-based CMS — edit JSON and Markdown, no database needed
- Blog with Markdown, syntax highlighting, and RSS feed
- Project showcase with images, technologies, and links
- Resume/CV with PDF generation (LaTeX) and interactive timeline
- Company & institution logos on experience/education items with graceful fallback
- LinkedIn sync — optionally pull experience and education data during build
- Dynamic Open Graph images per page (blog posts, projects, resume, contact)
- Credly certifications displayed automatically from your username
- SEO optimized — sitemaps, structured data, meta tags,
metadataBase - Vercel Analytics & Speed Insights built-in
- Interactive setup wizard (
npm run setup)
Click "Use this template" or "Fork" on GitHub, then:
git clone https://github.com/YOUR_USERNAME/portfolio.git
cd portfolio
npm installnpm run setupThis prompts for your name, email, GitHub username, etc. and generates config/site.json and content/profile/profile.json.
Or configure manually:
cp config/site.json.template config/site.json
cp content/profile/profile.json.template content/profile/profile.json
# Edit both files with your informationcontent/
├── experience/ # Work experience (JSON)
├── education/ # Education (JSON)
├── projects/ # Portfolio projects (JSON)
├── posts/ # Blog posts (Markdown)
├── skills/ # Skills list (JSON)
├── profile/ # Personal info (JSON)
└── testimonials.json # Testimonials
See CONFIG.md for content file formats and examples.
cp .env.example .env.localAvailable integrations: Google Search Console, AWS S3, Vercel Blob, Giscus comments, and LinkedIn sync. All are optional.
npm run devOpen http://localhost:3000 to see your portfolio.
- Run
npm run setupor manually createconfig/site.jsonfrom the template - Update
content/profile/profile.jsonwith your bio - Replace example content in
content/experience/,content/projects/,content/education/ - Update
content/skills/skills.jsonwith your skills - Copy
.env.exampleto.env.localand configure integrations - (Optional) Add your profile photo to
public/images/profile/ - (Optional) Add blog posts to
content/posts/ - (Optional) Set up LinkedIn sync for automatic experience/education updates
- (Optional) Update
LICENSEwith your name
portfolio/
├── app/ # Next.js 16 App Router
│ ├── api/ # API routes
│ ├── blog/ # Blog pages + OG images
│ ├── contact/ # Contact page + OG image
│ ├── portfolio/ # Portfolio pages + OG images
│ └── resume/ # Resume page + OG image
├── components/ # React components
├── config/ # Site configuration
│ ├── site.json # Main config file
│ └── site.json.template # Template for new users
├── content/ # Your content (JSON/Markdown)
├── hooks/ # Custom React hooks
├── lib/ # Utility functions
├── proxy.ts # Request proxy (redirects)
├── scripts/ # Build & automation scripts
│ ├── setup.sh # Interactive setup wizard
│ ├── sync-linkedin.ts # LinkedIn experience/education sync
│ ├── build-resume.sh # LaTeX PDF resume builder
│ └── optimize-images.mjs # Image optimization (WebP/AVIF)
├── public/ # Static assets & generated PDFs
└── types/ # TypeScript definitions
{
"site": {
"name": "Your Portfolio Name",
"title": "Your Name - Your Profession",
"shortName": "Your Name",
"description": "Your professional description...",
"url": "https://yourdomain.com",
"author": "Your Full Name",
"email": "your.email@example.com",
"location": "Your Location"
},
"social": {
"github": "https://github.com/yourusername",
"linkedin": "https://linkedin.com/in/yourprofile",
"twitter": "https://twitter.com/yourusername",
"website": "https://yourdomain.com"
},
"integrations": {
"credlyUsername": "your-credly-username",
"twitterHandle": "@yourusername"
}
}For detailed configuration instructions, see CONFIG.md.
Automatically syncs experience and education data from LinkedIn during build. The script updates metadata (titles, dates, logos, URLs) while preserving your manual content (responsibilities, translations, descriptions).
- Get your
li_atcookie from browser DevTools (LinkedIn > Application > Cookies) - Add to
.env.local:LINKEDIN_COOKIE=your-li_at-cookie-value LINKEDIN_USERNAME=your-linkedin-username - The sync runs automatically during
npm run build(prebuild step). It's non-fatal — if the cookie expires or is missing, the build continues with existing data.
You can also run it manually: npm run sync-linkedin
- Colors: Edit CSS variables in
app/globals.css(gold accent uses WCAG AA compliant values) - Fonts: Modify
app/layout.tsx - Components: Customize in
/components
- Profile:
public/images/profile/ - Projects:
public/images/projects/ - Blog:
public/images/posts/
The prebuild step runs automatically before next build:
- Image optimization — generates WebP and AVIF variants with responsive sizes
- Resume generation — compiles LaTeX templates into PDF (requires Docker or local pdflatex)
- LinkedIn sync — pulls latest experience/education data (optional, non-fatal)
- Push your code to GitHub
- Connect your repository to Vercel
- Deploy with zero configuration
Works on any platform that supports Next.js: Netlify, Railway, AWS Amplify, or self-hosted.
npm run setup # Interactive setup wizard
npm run dev # Start dev server (Turbopack)
npm run build # Build for production (includes prebuild pipeline)
npm run start # Start production server
npm run lint # Run ESLint
npm run test # Run tests (Vitest)
npm run test:watch # Run tests in watch mode
npm run test:coverage # Run tests with coverage
npm run analyze # Bundle analysis
npm run sync-linkedin # Sync experience/education from LinkedIn
npm run optimize-images # Optimize images (WebP/AVIF)Built-in support for multiple languages:
- English (en)
- Portuguese (pt)
- Spanish (es)
Language switching via header controls, with automatic content fallbacks.
npm test # Run all tests
npm run test:watch # Watch mode
npm run test:coverage # Coverage reportContributions are welcome! Whether you're fixing bugs, adding features, or improving documentation.
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if needed
- Submit a pull request
This project is open source and available under the MIT License.
Give it a star if this template helped you build your portfolio!
