A fullstack monorepo for a personal portfolio and blog with a backoffice.
Built with NestJS and Next.js, deployed on AWS with zero-downtime CI/CD.
| Layer | Tech |
|---|---|
| Frontend | Next.js 16, Tailwind CSS, Shadcn/ui, Zustand, Tanstack Query/Table |
| Backend | NestJS 11, GraphQL, REST, TypeORM |
| Database | PostgreSQL 17 |
| Storage | MinIO (local) / AWS S3 (prod) |
| Infra | AWS ECS Fargate, RDS, ALB — Terraform |
| CI/CD | GitHub Actions (OIDC) |
| Package manager | pnpm 10 workspaces |
Requirements: Node.js ≥ 20, pnpm ≥ 10, Docker
1. Clone and install dependencies
git clone https://github.com/chawkitariq/portfolio.git
cd portfolio
pnpm install2. Copy environment files
cp packages/api/.env.example packages/api/.env
cp packages/web/.env.example packages/web/.env3. Start infrastructure
docker compose up -dMinIO Console: http://localhost:9001
- username:
minio - password:
minio123
4. Start the apps
pnpm start| Service | URL |
|---|---|
| API | http://localhost:3000 |
| Web | http://localhost:3001 |
Navigate to /admin — unauthenticated users are redirected to /sign-in.
- JWT is stored in
localStorageand automatically attached to every request - CRUD posts with a Tiptap rich-text editor
- S3 image upload
All resources are managed with Terraform:
ECR, ECS Fargate, RDS, ALB, ACM, Route 53, S3, CloudWatch, IAM OIDC.
cd terraform
terraform init
terraform apply -var-file=terraform.tfvarsPushing to main with changes under packages/api/** or packages/web/** triggers a GitHub Actions workflow that:
- Builds the Docker image
- Pushes it to ECR
- Redeploys the ECS service with zero downtime