Skip to content

KelpyShades/folio

Repository files navigation

Portfolio - Kelvin Appiah

A modern, responsive portfolio website showcasing my work, experience, and skills as a full-stack developer. Built with Next.js, TypeScript, and Tailwind CSS.

🌐 Live Demo

Visit the live site: https://info-appiahkelvin.vercel.app

✨ Features

  • Modern UI/UX: Clean, glassmorphism-inspired design with smooth animations
  • Dark/Light Mode: Toggle between dark and light themes with persistent preferences
  • Responsive Design: Fully responsive across all device sizes
  • Project Showcase: Display featured projects with galleries, technologies, and impact
  • GitHub Integration: Live GitHub contribution calendar
  • SEO Optimized: Comprehensive meta tags, Open Graph, and structured data
  • Performance: Optimized images, caching, and fast page loads
  • Accessibility: Semantic HTML, ARIA labels, and keyboard navigation support

πŸ› οΈ Tech Stack

Core

Libraries & Tools

Fonts

  • Poppins: Headings and primary text
  • Geist Mono: Code and technical content

πŸ“‹ Prerequisites

Before you begin, ensure you have the following installed:

  • Node.js 20.x or higher
  • npm, yarn, or pnpm
  • Git

πŸš€ Getting Started

1. Clone the repository

git clone https://github.com/yourusername/folio.git
cd folio

2. Install dependencies

npm install
# or
yarn install
# or
pnpm install

3. Set up environment variables

Create a .env.local file in the root directory:

# Supabase Configuration
NEXT_PUBLIC_SUPABASE_URL=your_supabase_project_url
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY=your_supabase_anon_key

# Site Configuration (optional)
NEXT_PUBLIC_SITE_URL=https://yourdomain.com

4. Set up Supabase

  1. Create a new project at supabase.com
  2. Create a projects table with the following schema:
CREATE TABLE projects (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name TEXT NOT NULL,
  description TEXT NOT NULL,
  hero_image TEXT NOT NULL,
  gallery TEXT[] DEFAULT '{}',
  url TEXT DEFAULT '',
  github TEXT DEFAULT '',
  technologies TEXT[] DEFAULT '{}',
  team TEXT NOT NULL,
  role TEXT NOT NULL,
  start_date TIMESTAMPTZ NOT NULL,
  end_date TIMESTAMPTZ NOT NULL,
  status TEXT NOT NULL,
  category TEXT NOT NULL,
  is_featured BOOLEAN DEFAULT false,
  key_features TEXT[] DEFAULT '{}',
  impact TEXT DEFAULT '',
  created_at TIMESTAMPTZ DEFAULT NOW()
);
  1. Enable Row Level Security (RLS) and configure policies as needed

5. Run the development server

npm run dev
# or
yarn dev
# or
pnpm dev

Open http://localhost:3000 in your browser to see the result.

πŸ“ Project Structure

folio/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ assets/          # Images, SVGs, and static assets
β”‚   β”œβ”€β”€ components/      # React components
β”‚   β”‚   β”œβ”€β”€ Content/     # Main content sections
β”‚   β”‚   β”‚   β”œβ”€β”€ About/   # About, Experience, Education, Skills
β”‚   β”‚   β”‚   └── Projects/# Project showcase components
β”‚   β”‚   └── ProfileCard/ # Profile sidebar component
β”‚   β”œβ”€β”€ Global/          # Global utilities and constants
β”‚   β”œβ”€β”€ globals.css      # Global styles and Tailwind config
β”‚   β”œβ”€β”€ layout.tsx       # Root layout with metadata
β”‚   └── page.tsx         # Home page
β”œβ”€β”€ components/
β”‚   └── ui/              # shadcn/ui components
β”œβ”€β”€ lib/
β”‚   └── utils.ts         # Utility functions
β”œβ”€β”€ utils/
β”‚   └── supabase/        # Supabase client utilities
β”œβ”€β”€ public/              # Static files (favicons, manifest, etc.)
└── README.md

🎨 Customization

Update Personal Information

Edit app/Global/Strings.tsx to update:

  • Profile information
  • About content
  • Experience entries
  • Education details
  • Skills and technologies
  • Social media links

Styling

  • Global styles: app/globals.css
  • Theme colors: CSS custom properties in :root and .dark
  • Component styles: Tailwind classes with custom utilities

Images

  • Profile image: app/assets/images/profile2.png
  • Background texture: app/assets/images/bg-texture.png
  • Technology icons: app/assets/svgs/

πŸ“œ Available Scripts

  • npm run dev - Start development server
  • npm run build - Build for production
  • npm run start - Start production server
  • npm run lint - Run ESLint
  • npm run format - Format code with Prettier
  • npm run format:check - Check code formatting

🚒 Deployment

Deploy to Vercel

  1. Push your code to GitHub
  2. Import your repository on Vercel
  3. Add environment variables in Vercel dashboard
  4. Deploy!

The site will be automatically deployed on every push to the main branch.

Environment Variables for Production

Make sure to set these in your deployment platform:

  • NEXT_PUBLIC_SUPABASE_URL
  • NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY
  • NEXT_PUBLIC_SITE_URL (optional, defaults to Vercel URL)

πŸ” SEO & Performance

  • Meta Tags: Comprehensive Open Graph and Twitter Card support
  • Structured Data: JSON-LD schema for Person and Organization
  • Image Optimization: Next.js Image component with automatic optimization
  • Caching: Supabase queries cached for optimal performance
  • Font Optimization: Next.js font optimization for Poppins and Geist Mono

β™Ώ Accessibility

  • Semantic HTML5 elements
  • ARIA labels and roles
  • Keyboard navigation support
  • Screen reader friendly
  • WCAG compliant color contrasts

πŸ“ License

This project is private and proprietary.

πŸ‘€ Author

Kelvin Appiah

πŸ™ Acknowledgments


Built with ❀️ using Next.js and TypeScript

About

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published