Skip to content

Portfolio built with Contentlayer, Next.js, Tailwind CSS Typescript (T3 Stack), and deployed through Vercel

License

Notifications You must be signed in to change notification settings

ruchernchong/portfolio

Repository files navigation

Personal Portfolio

Deploy with Vercel License: MIT

Welcome to my portfolio website! Visit the live site at ruchern.dev

πŸš€ Tech Stack

This portfolio is built with modern web technologies:

Core Framework

  • Next.js 15 - React framework with App Router
  • React 19 - Latest React with concurrent features
  • TypeScript - Type-safe JavaScript with strict mode

Styling & UI

  • Tailwind CSS v4 - Utility-first CSS framework
  • Tailwind Typography - Beautiful typographic defaults
  • Lucide React - Beautiful & consistent icons
  • Class Variance Authority - Component variants

Content & Data

  • Contentlayer2 - Content SDK for MDX processing
  • MDX - Markdown with JSX components
  • Neon PostgreSQL - Serverless Postgres database
  • Drizzle ORM - Type-safe database toolkit
  • Upstash Redis - Serverless Redis for caching

Analytics & Monitoring

  • Custom Analytics - Privacy-focused visitor tracking
  • Vercel Analytics - Web vitals and performance
  • Vercel Speed Insights - Real user monitoring

Development & Testing

  • Vitest - Fast unit testing framework
  • Testing Library - React component testing
  • Biome - Fast linting and formatting
  • TypeScript - Strict mode type checking
  • Husky - Git hooks

Deployment & Infrastructure

  • Vercel - Deployment platform (Singapore region)
  • GitHub Actions - CI/CD workflows

πŸ› οΈ Getting Started

Prerequisites

  • Node.js 18.x or higher - JavaScript runtime
  • pnpm - Fast, disk space efficient package manager
  • Git - Version control system

Installation

  1. Clone the repository
git clone https://github.com/ruchernchong/portfolio.git
  1. Navigate to the project directory
cd portfolio
  1. Install dependencies
pnpm install
  1. Set up environment variables
cp .env.example .env
  1. Update the .env file with your configuration (see Environment Variables section)

  2. Set up the database

pnpm migrate
  1. Start the development server
pnpm dev

Your site should now be running at http://localhost:3000!

πŸ§ͺ Development Workflow

Available Scripts

# Development
pnpm dev              # Start development server with hot reload (uses Turbo)
pnpm build            # Build all apps for production (uses Turbo)
pnpm test             # Run tests across all apps (uses Turbo)
pnpm lint             # Run linting across all apps (uses Turbo)

# App-specific (from /apps/blog/)
pnpm dev              # Start blog dev server (contentlayer2 dev & next dev --turbopack)
pnpm build            # Build blog app for production
pnpm test             # Run Vitest tests with coverage
pnpm check-types      # TypeScript type checking
pnpm migrate          # Run database migrations
pnpm vercel-build     # Production build with migrations

# Quality & Release
pnpm release          # Create semantic release (runs build, test, lint, check-types)
pnpm release:blog     # Release blog app specifically

Testing Strategy

  • Unit Tests: Components and utilities with Vitest
  • Coverage Reports: Generated in coverage/ directory
  • Test Location: Tests located in __tests__/ directories alongside components

Code Style

  • TypeScript: Strict mode enabled with path aliases (@/*)
  • File Naming: kebab-case for filenames
  • Components: Functional components with hooks
  • Exports: Named exports preferred over default exports

πŸ“ Project Structure

This is a Turborepo monorepo with the following structure:

portfolio/
β”œβ”€β”€ apps/
β”‚   └── blog/              # Main Next.js application
β”‚       β”œβ”€β”€ app/           # Next.js App Router pages and API routes
β”‚       β”œβ”€β”€ components/    # Reusable React components
β”‚       β”œβ”€β”€ content/       # MDX blog posts
β”‚       β”œβ”€β”€ db/           # Database schema and setup
β”‚       β”œβ”€β”€ lib/          # Utility functions and integrations
β”‚       β”œβ”€β”€ migrations/   # Database migration files
β”‚       └── utils/        # Helper functions with tests
β”œβ”€β”€ packages/             # Shared packages (currently empty)
└── turbo.json           # Turborepo configuration

🎯 Key Features

  • πŸ“ Blog System: MDX-powered blog with syntax highlighting
  • πŸ“Š Analytics Dashboard: Custom privacy-focused visitor analytics
  • 🎨 Dark/Light Mode: Tailwind CSS theming support
  • πŸ“± Responsive Design: Mobile-first responsive layout
  • πŸ” SEO Optimized: Structured data, sitemaps, and meta tags
  • ⚑ Performance: Optimized images, caching, and core web vitals
  • πŸ”’ Privacy-First: IP hashing and minimal data collection
  • πŸš€ Modern Stack: Latest Next.js, React, and TypeScript features

🀝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your 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

πŸ“œ License

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

πŸ“« Contact

@ruchernchong

Project Link: https://github.com/ruchernchong/portfolio

About

Portfolio built with Contentlayer, Next.js, Tailwind CSS Typescript (T3 Stack), and deployed through Vercel

Topics

Resources

License

Stars

Watchers

Forks

Contributors 4

  •  
  •  
  •  
  •