My personal portfolio website built with Next.js, showcasing my work experience, projects, skills, and blog.
| Category | Technology |
|---|---|
| Framework | Next.js 14 (App Router) |
| Language | TypeScript 5 |
| Styling | Tailwind CSS, shadcn/ui |
| Animations | Framer Motion |
| Content | MDX (blog posts) |
| Analytics | Vercel Analytics & Speed Insights |
| CI/CD | GitHub Actions, Semantic Release |
Prerequisites: Node.js LTS
npm install
npm run devThe development server starts at http://localhost:3000.
| Command | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Build for production |
npm run start |
Start production server |
npm run lint |
Run ESLint |
This repo uses Conventional Commits and semantic-release to automate versioning and GitHub releases from main.
- Branch off
devel(e.g.feature/my-change,fix/my-bug). - Open a PR into
devel. The CI workflow (lint + build) runs automatically. - Always merge with "Squash and merge" — never "Rebase and merge" or "Create a merge commit". Every PR must land as a single commit so semantic-release can read the history correctly.
- Give the PR a Conventional Commits title, since it becomes the squash commit message:
feat: ...→ minor version bumpfix: ...→ patch version bumpfeat!: ...or aBREAKING CHANGE:footer → major version bumpchore:,docs:,refactor:, etc. → no release
- When
develis ready to ship, open a PR fromdevelintomainand squash-merge it the same way. The push tomaintriggers the release workflow, which runs semantic-release to tag a version and publish a GitHub release from the commit history.
main and devel are both protected branches: direct pushes, force-pushes, and branch deletion are blocked, and all changes must go through a reviewed PR.
Licensed under the Apache License, Version 2.0.