Skip to content

nerkoux/OS-PORTFOLIO

Repository files navigation

๐ŸŒ OS Portfolio

Typing SVG

A stunning, high-performance developer portfolio website built with cutting-edge technologies

Next.js 15 React 19 TypeScript Tailwind CSS

License Stars Forks Issues Last Commit

Features โ€ข Tech Stack โ€ข Installation โ€ข Customization โ€ข Deployment โ€ข License


โšก Features

๐ŸŽฏ Feature ๐Ÿ“ Description
โšก Lightning Fast Built on Next.js 15 with Turbopack for blazing fast development
๐ŸŽจ Beautiful UI Polished interface using shadcn/ui, Radix UI, and Tailwind CSS v4
๐Ÿ“Š GitHub Integration Dynamic widget that auto-fetches your GitHub profile data
๐Ÿ“ง Contact Form Working email API powered by Nodemailer (Gmail ready)
๐ŸŒ— Theme Support Seamless dark/light mode toggle with next-themes
๐Ÿ–ผ๏ธ Export Ready PDF export & screenshot capabilities built-in
๐ŸŒ€ Smooth Animations Fluid animations using Framer Motion
๐Ÿงฉ State Management Efficient state handling with Zustand
๐Ÿ”’ Type-Safe Full TypeScript support for reliability
โ™ฟ Accessible WCAG compliant with Radix UI primitives


๐Ÿ› ๏ธ Tech Stack

Core Technologies

Next.js
Next.js 15
React
React 19
TypeScript
TypeScript
Tailwind
Tailwind v4

UI & Animation

shadcn/ui
shadcn/ui
Radix UI
Radix UI
Framer Motion
Framer Motion
Lucide
Lucide Icons

Backend & Utilities

Category Technology
State Management Zustand
Email Service Nodemailer
PDF Generation jsPDF
Screenshots html2canvas
Audio Howler.js
Animations tailwindcss-animate


๐Ÿ“‚ Project Structure

os-portfolio/
โ”œโ”€โ”€ ๐Ÿ“ src/
โ”‚   โ”œโ”€โ”€ ๐Ÿ“ app/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“ api/
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“ send-email/
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ ๐Ÿ“„ route.ts          # Contact form email handler
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“„ layout.tsx
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“„ page.tsx                  # Homepage
โ”‚   โ”œโ”€โ”€ ๐Ÿ“ components/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“ os/
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“ widgets/
โ”‚   โ”‚   โ”‚       โ””โ”€โ”€ ๐Ÿ“„ github-app.tsx    # GitHub Profile Widget
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“ ui/                       # shadcn/ui components
โ”‚   โ”œโ”€โ”€ ๐Ÿ“ lib/
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“„ utils.ts
โ”‚   โ””โ”€โ”€ ๐Ÿ“ styles/
โ”‚       โ””โ”€โ”€ ๐Ÿ“„ globals.css
โ”œโ”€โ”€ ๐Ÿ“ public/
โ”‚   โ””โ”€โ”€ ๐Ÿ“ assets/
โ”œโ”€โ”€ ๐Ÿ“„ components.json                    # shadcn/ui config
โ”œโ”€โ”€ ๐Ÿ“„ next.config.ts
โ”œโ”€โ”€ ๐Ÿ“„ tailwind.config.js
โ”œโ”€โ”€ ๐Ÿ“„ tsconfig.json
โ”œโ”€โ”€ ๐Ÿ“„ package.json
โ”œโ”€โ”€ ๐Ÿ“„ .env.local.example
โ””โ”€โ”€ ๐Ÿ“„ README.md


โš™๏ธ Installation & Setup

๐Ÿ“ฆ Prerequisites
  • Node.js 18.17 or later
  • npm, yarn, or pnpm
  • Git
  • Gmail account (for contact form)

๐Ÿš€ Quick Start

# 1๏ธโƒฃ Clone the repository
git clone https://github.com/nerkoux/os-portfolio.git
cd os-portfolio

# 2๏ธโƒฃ Install dependencies
npm install
# or
yarn install
# or
pnpm install

# 3๏ธโƒฃ Create environment file
cp .env.local.example .env.local

# 4๏ธโƒฃ Configure your environment variables
# Edit .env.local and add:
# [email protected]
# SMTP_PASSWORD=your_app_password

# 5๏ธโƒฃ Run the development server
npm run dev

๐ŸŽ‰ Open http://localhost:3000 in your browser!

๐Ÿ“ง Gmail App Password Setup

Click to expand Gmail configuration steps
  1. Go to your Google Account
  2. Navigate to Security โ†’ 2-Step Verification (enable if not already)
  3. Scroll to App passwords
  4. Generate a new app password for "Mail"
  5. Copy the 16-character password
  6. Add it to your .env.local file as SMTP_PASSWORD

๐Ÿ’ก Note: Never use your actual Gmail password. Always use App Passwords for security.


๐Ÿง  Customization Guide

๐Ÿ”น 1. GitHub Widget Setup

File: src/components/os/widgets/github-app.tsx

// Replace with your GitHub username
const username = 'your-github-username' // ๐Ÿ‘ˆ Change this

useEffect(() => {
  fetchGitHubData()
}, [])

const fetchGitHubData = async () => {
  setLoading(true)
  setError(null)
  
  try {
    // Add delay to avoid rate limiting
    await new Promise(resolve => setTimeout(resolve, 100))
    
    // Fetch profile data with proper headers
    const profileResponse = await fetch(
      `https://api.github.com/users/${username}`,
      {
        headers: {
          'Accept': 'application/vnd.github.v3+json',
          'User-Agent': 'Portfolio-App'
        }
      }
    )

    if (!profileResponse.ok) throw new Error('Failed to fetch profile')
    
    const profileData = await profileResponse.json()
    setProfile(profileData)
    
    // Fetch repositories...
  } catch (err) {
    setError('Failed to load GitHub data.')
  } finally {
    setLoading(false)
  }
}
๐Ÿ’ก Pro Tip: Using GitHub Personal Access Token

For higher API rate limits, add a GitHub token:

// In .env.local
GITHUB_TOKEN=ghp_your_token_here

// In github-app.tsx
const token = process.env.NEXT_PUBLIC_GITHUB_TOKEN

const profileResponse = await fetch(
  `https://api.github.com/users/${username}`,
  {
    headers: {
      'Authorization': token ? `Bearer ${token}` : '',
      'Accept': 'application/vnd.github.v3+json',
    }
  }
)

๐Ÿ”น 2. Contact Form Configuration

File: src/app/api/send-email/route.ts

import { NextResponse } from 'next/server'
import nodemailer from 'nodemailer'

export async function POST(request: Request) {
  try {
    const { name, email, message } = await request.json()

    // Validation
    if (!name || !email || !message) {
      return NextResponse.json(
        { error: 'Missing required fields' },
        { status: 400 }
      )
    }

    // Gmail SMTP Setup
    const transporter = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: process.env.SMTP_EMAIL,
        pass: process.env.SMTP_PASSWORD,
      },
    })

    // Send email
    await transporter.sendMail({
      from: process.env.SMTP_EMAIL,
      to: process.env.SMTP_EMAIL, // Your email
      subject: `Portfolio Contact: ${name}`,
      text: message,
      html: `
        <h2>New Contact Form Submission</h2>
        <p><strong>Name:</strong> ${name}</p>
        <p><strong>Email:</strong> ${email}</p>
        <p><strong>Message:</strong></p>
        <p>${message}</p>
      `,
    })

    return NextResponse.json({ success: true })
  } catch (error) {
    console.error('Email error:', error)
    return NextResponse.json(
      { error: 'Failed to send email' },
      { status: 500 }
    )
  }
}
๐Ÿ”„ Alternative Email Providers

Outlook/Hotmail:

service: 'hotmail'

Yahoo:

service: 'yahoo'

Custom SMTP:

const transporter = nodemailer.createTransport({
  host: 'smtp.example.com',
  port: 587,
  secure: false,
  auth: {
    user: process.env.SMTP_EMAIL,
    pass: process.env.SMTP_PASSWORD,
  },
})

๐Ÿ”น 3. UI Customization

Tailwind Configuration

File: tailwind.config.js

module.exports = {
  theme: {
    extend: {
      colors: {
        // Customize your color palette
        primary: {
          50: '#eff6ff',
          // ... add your colors
          900: '#1e3a8a',
        },
      },
      animation: {
        // Add custom animations
        'fade-in': 'fadeIn 0.5s ease-in-out',
      },
    },
  },
}

Add shadcn/ui Components

# Add individual components
npx shadcn-ui@latest add button
npx shadcn-ui@latest add card
npx shadcn-ui@latest add input
npx shadcn-ui@latest add dialog

# View all available components
npx shadcn-ui@latest add


๐Ÿงฉ Available Scripts

Command Description
npm run dev ๐Ÿš€ Start development server with Turbopack
npm run build ๐Ÿ“ฆ Build for production
npm run start โ–ถ๏ธ Start production server
npm run lint ๐Ÿ” Run ESLint checks
npm run type-check โœ… Run TypeScript type checking


๐Ÿš€ Deployment

โžค Vercel (Recommended)

Deploy with Vercel

Steps:

  1. Push your code to GitHub
  2. Import your repository on Vercel
  3. Add environment variables:
    • SMTP_EMAIL
    • SMTP_PASSWORD
  4. Click Deploy ๐ŸŽ‰

โžค Manual Build

# Build the application
npm run build

# Start production server
npm run start

โžค Alternative Hosting

Netlify
# Install Netlify CLI
npm install -g netlify-cli

# Deploy
netlify deploy --prod
Docker
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .
RUN npm run build

EXPOSE 3000

CMD ["npm", "start"]
docker build -t os-portfolio .
docker run -p 3000:3000 os-portfolio
AWS (S3 + CloudFront)
# Build static export
npm run build

# Deploy to S3
aws s3 sync out/ s3://your-bucket-name --delete


๐Ÿ“ธ Screenshots

๐Ÿ  Homepage

Homepage

๐Ÿ“Š GitHub Widget

GitHub Widget

๐Ÿ“ง Contact Form

Contact Form

๐ŸŒ— Dark Mode

Dark Mode


๐Ÿ”ฎ Roadmap & Future Enhancements

  • ๐Ÿ“ Blog Section with MDX support
  • ๐Ÿ”’ reCAPTCHA Integration for spam protection
  • ๐Ÿ“ˆ Analytics Dashboard (Google Analytics / Plausible)
  • ๐ŸŒ i18n Support for multiple languages
  • ๐ŸŽจ Theme Customizer with live preview
  • ๐Ÿ“ฑ PWA Support for offline functionality
  • ๐Ÿ”” Web Push Notifications
  • ๐Ÿงช Unit & E2E Tests with Jest and Playwright
  • ๐Ÿ“Š Admin Panel for content management
  • ๐Ÿš€ Performance Monitoring with Sentry


๐Ÿค Contributing

Contributions are always welcome! Here's how you can help:

  1. ๐Ÿด Fork the repository
  2. ๐ŸŒฟ Create a feature branch (git checkout -b feature/AmazingFeature)
  3. ๐Ÿ’พ Commit your changes (git commit -m 'Add some AmazingFeature')
  4. ๐Ÿ“ค Push to the branch (git push origin feature/AmazingFeature)
  5. ๐Ÿ”€ Open a Pull Request
๐Ÿ“‹ Contribution Guidelines
  • Follow the existing code style
  • Write meaningful commit messages
  • Update documentation as needed
  • Add tests for new features
  • Ensure all tests pass before submitting PR


๐Ÿ› Bug Reports & Feature Requests

Found a bug? Have a feature suggestion? Please open an issue with:

  • ๐Ÿ› Clear description of the bug/feature
  • ๐Ÿ“ธ Screenshots (if applicable)
  • ๐Ÿ” Steps to reproduce (for bugs)
  • ๐Ÿ’ก Expected behavior
  • ๐Ÿ–ฅ๏ธ Environment details


๐Ÿง‘โ€๐Ÿ’ป Author

Akshat Mehta

Akshat Mehta

Full Stack Developer | UI/UX Enthusiast

Portfolio GitHub LinkedIn Email


Original concept inspired by @nerkoux


๐Ÿ“œ License

This project is licensed under the MIT License - see the LICENSE file for details.

MIT License

Copyright (c) 2025 Akshat Mehta

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction...

License: MIT


๐Ÿ’– Support

If you found this project helpful, please consider:

โญ Star this repository

๐Ÿด Fork and share

โ˜• Buy me a coffee

Buy Me A Coffee


๐ŸŒŸ Show some โค๏ธ by starring this repository!


Made with โค๏ธ and lots of โ˜•

Wave