Sponsored by HostedPocket.com - The easiest way to host PocketBase in the cloud
A modern, responsive portfolio website built with Nuxt 4, PocketBase, and Tailwind CSS. Perfect for developers, designers, and professionals who want to showcase their work with a clean, performant, and SEO-optimized portfolio.
β¨ Get other templates at NuxtMint.com
- π¨ Modern Design: Clean, professional layout with dark/light theme support
- π± Fully Responsive: Mobile-first design that looks great on all devices
- β‘ Performance Optimized: Built with Nuxt 4 for maximum speed and SEO
- ποΈ Dynamic Content: Powered by PocketBase for easy content management
- π Theme Toggle: System preference detection with localStorage persistence
- π§ Type Safe: Full TypeScript support with proper type definitions
- Nuxt 4 - The Intuitive Vue Framework
- PocketBase - Open source backend in 1 file
- Tailwind CSS - Utility-first CSS framework
- Nuxt Icon - Icon component with 100k+ icons
- Node.js (v18 or higher)
- npm
- PocketBase instance (local or hosted)
# Clone the repository
git clone <this-repo-url>
cd nuxt-portfolio
# Install dependencies
npm install
Create a .env
file in the root directory:
# Copy the example environment file
cp .env.example .env
Update the .env
file with your PocketBase URL:
# PocketBase Configuration
POCKETBASE_URL=http://localhost:8090
# or your hosted PocketBase URL
# POCKETBASE_URL=https://your-pocketbase-instance.hostedpocket.com
# Demo Mode (optional)
DEMO=false
- Download PocketBase from pocketbase.io
- Start PocketBase:
./pocketbase serve
- Access Admin Panel: Open
http://localhost:8090/_/
and create an admin account
- Sign up at HostedPocket.com
- Create a new instance
- Update your
.env
file with the hosted URL
- Open PocketBase Admin Panel (
http://localhost:8090/_/
or your hosted URL) - Go to Settings β Import collections
- Upload the
database/pocketbase.json
file - Click Import to create all collections
We've created an automated seeding script to populate your database with sample data. This is much faster than manually entering data through the admin panel.
-
Add superuser credentials to your
.env
file:# Superuser credentials for seeding SUPERUSER_EMAIL=your-admin@example.com SUPERUSER_PASSWORD=your-admin-password
-
Run the seeding script:
npm run seed # or node scripts/seed-database.js
-
Verify the data (optional):
npm run verify # or node scripts/verify-data.js
The seeding script will create:
- 1 Profile record - Your personal information and contact details
- 3 Experience records - Sample work history with technologies
- 2 Education records - Academic background and certifications
- 3 Skills categories - Frontend, Backend, and Tools & DevOps
- 4 Project records - Portfolio projects with GitHub/demo links
If you prefer to add data manually or customize the sample data:
- Open PocketBase Admin Panel (
http://localhost:8090/_/
or your hosted URL) - Navigate to Collections and add records to each collection:
- profile: Personal info, contact details, availability status
- experience: Work history with job titles, companies, and technologies
- education: Academic background and certifications
- skills: Technical skills organized by category
- projects: Portfolio projects with descriptions and links
To customize the sample data before seeding:
- Edit
scripts/seed-database.js
- Update the data objects with your information
- Run the seeding script with your custom data
# Start the development server
npm run dev
Visit http://localhost:3000
to see your portfolio!
nuxt-portfolio/
βββ app/ # Nuxt 4 app directory
β βββ components/ # Vue components
β β βββ demo/ # Demo-specific components
β β βββ AppHeader.vue # Site header
β β βββ AppFooter.vue # Site footer
β β βββ HeroSection.vue # Hero/intro section
β β βββ ExperienceSection.vue
β β βββ EducationSection.vue
β β βββ SkillsSection.vue
β β βββ ProjectsSection.vue
β β βββ ContactSection.vue
β βββ composables/ # Vue composables
β β βββ usePocketBase.ts # PocketBase integration
β β βββ useTheme.ts # Theme management
β βββ pages/ # Page components
β β βββ index.vue # Homepage
β βββ types/ # TypeScript definitions
β β βββ index.ts # Type definitions
β βββ app.vue # Root component
βββ database/ # Database configuration
β βββ pocketbase.json # PocketBase schema export
βββ public/ # Static assets
βββ server/ # Server-side code (if needed)
βββ .env.example # Environment variables template
βββ nuxt.config.ts # Nuxt configuration
βββ package.json # Dependencies
Cloudflare Pages offers excellent performance, global CDN, and seamless integration with Nuxt.
-
Setup Wrangler Configuration:
# Copy the example wrangler config cp wrangler.jsonc.example wrangler.jsonc
-
Update wrangler.jsonc with your project details:
-
Deploy via Wrangler CLI :
# Install Wrangler CLI npm install -g wrangler # Login to Cloudflare wrangler login # Deploy npm run build npm run deploy
This Nuxt application can be deployed to any platform that supports Node.js or static hosting. Check the Nuxt deployment documentation for more options.
- Colors: Modify Tailwind classes in components
- Fonts: Update
nuxt.config.ts
to add custom fonts - Layout: Adjust component structure and spacing
- Sections: Add/remove sections by editing
pages/index.vue
- Components: Customize individual section components
- Data: Update content through PocketBase admin panel
- Analytics: Add tracking codes to
nuxt.config.ts
- SEO: Customize meta tags in page components
- Performance: Optimize images and add lazy loading
Contributions are welcome! Please feel free to submit a Pull Request.
This project is open source and available under the MIT License.
- HostedPocket.com for sponsoring this project
- NuxtMint.com for premium Nuxt templates
- Nuxt Team for the amazing framework
- PocketBase for the simple yet powerful backend