A modern, responsive portfolio website built with Next.js 15, React 19, and TypeScript.
- Responsive Design - Optimized for all devices and screen sizes
- Modern Tech Stack - Built with Next.js 15, React 19, and TypeScript
- Performance Optimized - Server-side rendering and optimized assets
- SEO Optimized - Comprehensive SEO with structured data, Open Graph, and sitemaps
- Accessibility - WCAG AA compliant with proper ARIA labels
- Blog System - Markdown-based blog with comprehensive syntax support
- Dynamic Content - Centralized configuration files for easy updates
- Rich Markdown - Full markdown support including tables, quotes, and code highlighting
- Tag System - Categorized blog posts and portfolio projects
- Consistent Branding - Follows established brand guidelines from
BRAND.md - Professional Design - Clean, modern UI with strategic use of brand colors
- Content Strategy - Aligned with brand messaging and positioning
- Next.js 15 - React framework with App Router
- React 19 - Latest React with concurrent features
- TypeScript - Type-safe development
- Tailwind CSS 4 - Utility-first CSS framework
- Shadcn/ui - High-quality React components
- Lucide React - Beautiful, customizable icons
- Geist Font - Modern, readable typography
- React Syntax Highlighter - Code block formatting
- Markdown Processing - Custom markdown parser with table and formatting support
- Dynamic OG Images - Auto-generated social media images
- Structured Data - JSON-LD schema markup for search engines
- Vitest - Fast unit testing framework
- React Testing Library - Component testing utilities
- Storybook - Component development and documentation
- Chromatic - Visual regression testing and review
- ESLint - Code quality and style enforcement
- TypeScript - Static type checking
- pnpm - Fast, disk space efficient package manager
- PostCSS - CSS processing and optimization
- Autoprefixer - CSS vendor prefixing
portfolio-website/
βββ app/ # Next.js App Router pages
β βββ blog/ # Blog pages
β β βββ [slug]/ # Individual blog post pages
β β βββ page.tsx # Blog index page
β βββ globals.css # Global styles and CSS variables
β βββ layout.tsx # Root layout component
β βββ page.tsx # Home page
βββ components/ # Reusable React components
β βββ blog/ # Blog-specific components
β β βββ BlogHero.tsx # Blog page hero section
β β βββ BlogPostCard.tsx # Blog post preview card
β β βββ BlogPostHeader.tsx # Blog post header
β β βββ BlogPostList.tsx # Blog post list container
β β βββ BlogPostPage.tsx # Individual blog post page
β βββ markdown/ # Markdown processing components
β β βββ Markdown.tsx # Main markdown renderer
β β βββ InlineContent.tsx # Inline formatting component
β β βββ markdownProcessor.ts # Markdown parsing logic
β β βββ elements/ # Individual markdown element components
β β βββ MarkdownHeading.tsx
β β βββ MarkdownCodeBlock.tsx
β β βββ MarkdownList.tsx
β β βββ MarkdownTable.tsx
β β βββ ... (other elements)
β βββ cards/ # Card components
β β βββ ProjectCard.tsx # Portfolio project card
β β βββ ServiceCard.tsx # Service offering card
β βββ layout/ # Layout components
β β βββ Footer.tsx # Site footer
β β βββ Header.tsx # Site header
β β βββ Navigation.tsx # Navigation component
β βββ sections/ # Page section components
β β βββ AboutSection.tsx # About section
β β βββ CtaSection.tsx # Call-to-action section
β β βββ ExperienceSection.tsx # Experience and skills section
β β βββ HeroSection.tsx # Hero section
β β βββ PortfolioSection.tsx # Portfolio projects section
β β βββ ServicesSection.tsx # Services section
β βββ ui/ # Base UI components (Shadcn/ui)
β βββ Badge.tsx # Badge component
β βββ Button.tsx # Button component
β βββ Card.tsx # Card component
βββ config/ # Configuration and data files
β βββ blog.ts # Blog post metadata
β βββ experience.ts # Experience and skills data
β βββ portfolio.ts # Portfolio projects data
β βββ services.ts # Services data
βββ content/ # Content files
β βββ blog/ # Markdown blog posts
β βββ how-to-hire-your-first-developer.md
β βββ how-to-use-ai-to-build-apps-10x-speed.md
β βββ nodejs-vs-python-framework-magic.md
βββ lib/ # Utility functions
β βββ cssUtils.ts # CSS utility functions
β βββ date.ts # Date formatting utilities
β βββ opengraphUtils.tsx # Open Graph image generation utilities
βββ public/ # Static assets
βββ test/ # Test configuration
β βββ setup.ts # Test setup file
βββ BRAND.md # Brand guidelines and identity
βββ DEVELOPMENT_GUIDE.md # Comprehensive development standards and testing guidelines
βββ MARKDOWN.md # Markdown features and syntax documentation
βββ package.json # Project dependencies and scripts
βββ tsconfig.json # TypeScript configuration
βββ vitest.config.ts # Vitest configuration
βββ eslint.config.js # ESLint configurationThis project follows the brand guidelines defined in BRAND.md:
- Creator - Innovative, imaginative, brings new ideas to life
- Sage - Wise, insightful, explains the "why" and "how"
- Ruler - Organized, authoritative, ensures stability and success
- Primary - Dark Gray (#1F2937) - Authority, trust
- Accent - Warm Orange (#F59E0B) - Prestige, leadership
- Action - Electric Blue (#2563EB) - Innovation, interactivity
- Creation - Turn visions into reality through innovative development
- Wisdom - Deep understanding of business and technology
- Leadership - Manage teams and complex projects effectively
- Node.js 18+
- pnpm (recommended) or npm
-
Clone the repository
git clone https://github.com/ch1ll0ut1/portfolio-website.git cd portfolio-website -
Install dependencies
pnpm install
-
Start development server
pnpm dev
-
Open your browser Navigate to http://localhost:3000
# Development
pnpm dev # Start development server
pnpm build # Build for production
pnpm start # Start production server
# Testing
pnpm test # Run tests
pnpm test:watch # Run tests in watch mode
pnpm test:coverage # Run tests with coverage
# Storybook
pnpm storybook # Start Storybook development server
pnpm build-storybook # Build static Storybook
# Code Quality
pnpm lint # Run ESLintThe project uses a comprehensive testing strategy:
- Component Tests - All React components have unit tests
- Configuration Tests - Data integrity tests for config files
- Integration Tests - End-to-end functionality testing
- Vitest - Fast, modern test runner
- React Testing Library - Component testing utilities
- Jest DOM - Custom DOM element matchers
# Run all tests
pnpm test
# Run tests in watch mode
pnpm test:watch
# Run tests with coverage
pnpm test:coverageThis project uses Storybook for component development and documentation, with Chromatic for visual regression testing.
Storybook provides an isolated environment for developing and documenting components:
- Component Development - Build components in isolation
- Documentation - Auto-generated component docs and props
- Interactive Testing - Test different component states and props
- Design System - Visual component library and guidelines
# Start Storybook development server
pnpm storybook
# Build static Storybook for production
pnpm build-storybookStories are located alongside components with .stories.tsx extension:
// components/ui/Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';
const meta: Meta<typeof Button> = {
title: 'UI/Button',
component: Button,
parameters: {
layout: 'centered',
},
tags: ['autodocs'],
};
export default meta;
type Story = StoryObj<typeof meta>;
export const Primary: Story = {
args: {
variant: 'default',
children: 'Button',
},
};Chromatic provides automated visual regression testing and review workflows:
- Visual Regression Testing - Catch unintended visual changes
- Cross-browser Testing - Test across different browsers and devices
- Review Workflow - Approve or reject visual changes
- Design Token Validation - Ensure consistent design system usage
Chromatic runs automatically via GitHub Actions on every push and pull request:
- Automatic Deployment - Chromatic builds triggered by GitHub Actions CI/CD
- Visual Comparison - New screenshots automatically compared against baselines
- PR Integration - Visual changes shown as checks in pull requests
- Review Process - Changes flagged for manual review and approval
- Baseline Updates - Approved changes automatically become new baselines
Fully automated setup:
- GitHub Actions Trigger - Runs on every push and PR automatically
- Zero Manual Setup - No local Chromatic commands needed
- PR Status Checks - Visual regression results visible in GitHub PR interface
- Automatic Baseline Management - Baselines update on main branch merges
No manual intervention required - Chromatic testing happens seamlessly as part of the standard development workflow.
| Test Type | Tool | Purpose | Scope |
|---|---|---|---|
| Unit Tests | Vitest + RTL | Component behavior, logic, accessibility | Individual components |
| Visual Tests | Chromatic | Visual appearance, responsive design | Component rendering |
| Integration | Vitest | Component interaction, data flow | Multiple components |
| End-to-end | Manual/Future | User workflows, full application | Complete user journeys |
- Component behavior and state changes
- Props handling and validation
- Accessibility (ARIA labels, keyboard navigation)
- Edge cases and error handling
- Integration with child components
- Component appearance and styling
- Responsive design across breakpoints
- Design system consistency
- Visual states (hover, focus, disabled)
- Cross-browser compatibility
π‘ For detailed testing guidelines and examples, see the comprehensive testing section in
DEVELOPMENT_GUIDE.md
Blog posts are written in Markdown and stored in content/blog/ with comprehensive syntax support including tables, quotes, code highlighting, and inline formatting.
π For complete markdown syntax documentation and examples, see
MARKDOWN.md
Content is managed through TypeScript configuration files:
config/blog.ts- Blog post metadataconfig/portfolio.ts- Portfolio projectsconfig/services.ts- Service offeringsconfig/experience.ts- Experience and skills
This project follows the development standards outlined in DEVELOPMENT_GUIDE.md:
- YAGNI - You Aren't Gonna Need It
- KISS - Keep It Simple, Stupid
- Component-Based Architecture - Clear separation of concerns
- Modular Design - Independent, testable modules
- Self-contained modules - Components, tests, and utilities co-located
- Single responsibility - Each file has one clear purpose
- Test-driven development - Tests written before implementation
- Type safety - Full TypeScript coverage
- PascalCase for React components
- camelCase for utilities and functions
- kebab-case for directories and URLs
- Strict type checking enabled
- Path aliases configured (
@/points to project root) - Modern ES2022 target
- Stylistic rules for consistent code formatting
- Import rules for proper module organization
- React-specific rules for component best practices
- Custom color palette matching brand guidelines
- Responsive design utilities
- Animation and transition classes
- Server-side rendering for better SEO and performance
- Image optimization with Next.js Image component
- Code splitting for reduced bundle sizes
- Static generation where possible
- Dynamic Metadata: Page-specific titles, descriptions, and keywords
- Open Graph Images: Auto-generated social media preview images
- Structured Data: JSON-LD schema markup for rich snippets
- Sitemap Generation: Dynamic XML sitemap with all pages and blog posts
- Robots.txt: Search engine crawling instructions
- Canonical URLs: Prevents duplicate content issues
- Breadcrumb Navigation: Improves user experience and SEO
- Meta Tags: Comprehensive meta tag optimization
- Performance: 95+
- Accessibility: 100
- Best Practices: 100
- SEO: 100
This is a personal portfolio project, but contributions are welcome for:
- Bug fixes - Report issues and submit fixes
- Documentation - Improve README and code comments
- Accessibility - Enhance accessibility features
- Performance - Optimize loading times and user experience
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Ensure all tests pass
- Submit a pull request
This project is licensed under the MIT License - see the LICENSE file for details.
Built with β€οΈ using Next.js, React, and TypeScript