Next.js Portfolio Kit is a minimal, SEO-first portfolio template. Edit one file β portfolio.config.ts β and the entire site updates: metadata, Open Graph, JSON-LD, sitemap, OG image, and page content.
- β‘οΈ Next.js 16 App Router with static generation (
generateStaticParams) - βοΈ React 19 Server Components by default
- π¨ Tailwind CSS v4 with OKLCH design tokens and dark mode
- π i18n β native Next.js 16 routing, "as-needed" URL prefixing (
/for EN,/rufor RU) - π SEO β
generateMetadata, canonical URLs, hreflang +x-default, Open Graph, Twitter Card,robots.txt,sitemap.xml - π JSON-LD structured data (Person schema via
schema-dts) - πΌοΈ Dynamic OG image β auto-generated via
next/og - βΏ Accessibility β WCAG 2.4.1 skip link, semantic HTML,
aria-*attributes - π Dark / light mode via
next-themes - π TypeScript strict mode
- π§ shadcn/ui + Radix UI component primitives
- Framework: Next.js 16
- React: React 19
- Language: TypeScript 5
- CSS Framework: Tailwind CSS v4
- Components: shadcn/ui + Radix UI
- Icons: Lucide React
- Structured Data: schema-dts
- Analytics: Vercel Speed Insights
- Node.js 22 or higher
- pnpm (recommended)
- Clone the repository
git clone https://github.com/Dtem4ik/nextjs-portfolio-kit.git
cd nextjs-portfolio-kit- Install dependencies
pnpm install- Add your photo
Place a 400Γ400px WebP or JPEG at public/photo.jpg.
- Edit your personal data
# This is the only file you need to edit
open portfolio.config.tsFill in your name, title, bio, domain, and social links. Everything else derives from this config automatically.
- Start the development server
pnpm devNavigate to http://localhost:3000
All personal data lives in a single file:
// portfolio.config.ts
export const portfolioConfig = {
name: "Your Name",
title: { en: "Frontend Engineer", ru: "..." },
bio: { en: "...", ru: "..." },
photo: "/photo.jpg",
url: "https://yourdomain.com",
social: {
github: "https://github.com/username",
linkedin: "https://linkedin.com/in/username",
email: "",
telegram: "",
instagram: "",
facebook: "",
whatsapp: "",
},
keywords: { en: [...], ru: [...] },
locale: { default: "en", supported: ["en", "ru"] },
};nextjs-portfolio-kit/
βββ app/
β βββ [lang]/ # Locale-based routing
β β βββ layout.tsx # Root layout, metadata, generateStaticParams
β β βββ page.tsx # Home page
β β βββ not-found.tsx # Locale-aware 404
β β βββ opengraph-image.tsx # Dynamic OG image (1200Γ630)
β βββ robots.ts # /robots.txt generator
β βββ sitemap.ts # /sitemap.xml generator
β βββ globals.css # Tailwind v4 config + OKLCH tokens
βββ components/
β βββ ui/ # shadcn/ui primitives (CLI-managed, do not edit)
β βββ lang-toggle.tsx # Language switcher
β βββ mode-toggle.tsx # Dark/light theme toggle
β βββ theme-provider.tsx # next-themes provider
βββ dictionaries/
β βββ en.json # English UI strings
β βββ ru.json # Russian UI strings
βββ lib/
β βββ dictionaries.ts # getDictionary() β server-only
β βββ i18n.ts # Locale config, labels, OG locale map
β βββ structured-data.ts # JSON-LD Person schema builder
β βββ utils.ts # cn() β clsx + tailwind-merge
βββ public/ # Static assets (place photo.jpg here)
βββ portfolio.config.ts # β Single source of truth β edit this
βββ proxy.ts # Next.js 16 Proxy β i18n routing
βββ components.json # shadcn/ui config
βββ next.config.ts # Next.js config
βββ package.json # Dependencies and scripts
# Development
pnpm dev # Start dev server
# Build
pnpm build # Create production build
pnpm start # Start production server
# Code Quality
pnpm lint # Run linter
pnpm lint:fix # Auto-fix linting issues
pnpm format # Format code
pnpm format:check # Check code formatting
pnpm typecheck # Run TypeScript type checking- Add the locale to
portfolio.config.ts:locale: { default: "en", supported: ["en", "ru", "de"] }
- Add
dictionaries/de.json(copy fromen.jsonand translate) - Register it in
lib/dictionaries.tsdictionaries map - Add the OG locale mapping to
lib/i18n.tsβogLocale
After deploying, submit your sitemap to Google Search Console:
https://yourdomain.com/sitemap.xml
- GitHub: @Dtem4ik
- Project: nextjs-portfolio-kit
Contributions are welcome! If you'd like to improve the project:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
See CONTRIBUTING.md for commit conventions and code quality rules.
This project is licensed under the MIT License. See the LICENSE file for details.
- Next.js β for the amazing framework
- Vercel β for hosting and tools
- Tailwind CSS β for the awesome CSS framework
- shadcn/ui β for the component system
Made with β€οΈ by Dtem4ik