My personal portfolio website — a showcase of my projects, skills, and blog posts.
- Next.js 16 (App Router)
- React 19
- TypeScript
- Tailwind CSS 4
- Framer Motion for animations
npm install
npm run devOpen http://localhost:3000 to view the site.
| Command | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Production build |
npm run start |
Start production server |
npm run lint |
Run ESLint |
npm run format |
Check Prettier formatting |
npm run format:fix |
Auto-fix formatting |
app/ Next.js App Router pages
├── page.tsx Home (intro, about, projects)
├── blog/
│ ├── page.tsx Blog listing
│ └── [name]/ Dynamic blog post routes
components/ Reusable UI components
blogs/ Blog post content (TSX) and registry
public/
├── projects.json Project data
├── langlinks.json Technology → documentation URL mapping
├── icons/ SVG icons
├── images/ Portfolio images
└── knows/ Technology logos
- Create a new TSX file in
blogs/that exports an object withtitle,publishedAt,readTime, andcomponent - Add it to the registry in
blogs/index.tsx - The post will be accessible at
/blog/<registry-key>
Pushes to main trigger a GitHub Actions workflow that:
- Builds a Docker image (multi-stage, Node 22-alpine)
- Pushes to
docker.bedson.tech - Deploys to the server via SSH + Docker Compose
See SETUP.md for required secrets and server configuration.