This repository is my attempt to build a Vercel clone only for React and Next.js projects.
It is split into 3 services:
upload-service: accepts a GitHub repo URL, uploads project files to S3, and pushes a build job ID to Redis.deploment-service: worker that picks IDs from Redis, builds the project, and uploads final build output back to S3.request-handler-service: serves built assets from S3 based on subdomain/project ID.
- Node.js + npm
- Redis
- AWS S3 bucket and credentials
Start Redis first:
redis-serverKeep this terminal running.
cd upload-service
npm install
cd ../deploment-service
npm install
cd ../request-handler-service
npm installCreate .env files in each service folder.
upload-service/.env
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key
S3_BUCKET_NAME=your_bucket_name
S3_BUCKET_REGION=your_bucket_regiondeploment-service/.env
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key
S3_BUCKET_NAME=your_bucket_name
S3_BUCKET_REGION=your_bucket_regionrequest-handler-service/.env
AWS_ACCESS_KEY_ID=your_access_key
AWS_SECRET_ACCESS_KEY=your_secret_key
S3_BUCKET_NAME=your_bucket_name
S3_BUCKET_REGION=your_bucket_regionTerminal 1:
cd upload-service
npm startTerminal 2:
cd deploment-service
npm startTerminal 3:
cd request-handler-service
npm startInstall Docker Desktop (Docker Compose is included).
Create these files from examples and fill your values:
upload-service/.envfromupload-service/.env.examplerequest-handler-service/.envfromrequest-handler-service/.env.exampledeployment-service/.envfromdeployment-service/.env.examplenextjs-frontend/.env.localfromnextjs-frontend/.env.example
From project root:
docker compose up -dFrontend will be available at http://localhost:3002.
docker compose downupload-service:http://localhost:3000request-handler-service:http://localhost:3001deploment-service: background worker (no HTTP port)
- The build worker currently uploads files from
dist/, so repository build output should be available there. request-handler-serviceresolves project ID from subdomain and fetches files from S3 (dist/{id}/...).


