A production-grade, serverless platform for deploying frontend applications with automatic builds, preview deployments, and custom domains, inspired by Vercel.

Vercel Clone is a full-stack, serverless deployment platform built on AWS and Go for the backend, and React + TypeScript for the frontend. It enables users to create projects, trigger builds from GitHub, and deploy static sites with preview and production URLs. The backend leverages AWS Lambda, API Gateway, S3, DynamoDB, and SQS for scalable, event-driven workflows. The frontend provides a modern dashboard for managing projects, deployments, and build logs, with real-time status updates and a polished UI.
Coordinating asynchronous build jobs and status updates in a serverless environment
Used SQS for reliable build job queuing and Lambda for scalable execution
SQS Build Job Enqueue (Backend)
// Enqueue a build job in SQS
func EnqueueBuildJob(job BuildJob) error {
msg, err := json.Marshal(job)
if err != nil {
return err
}
_, err = sqsClient.SendMessage(context.TODO(), &sqs.SendMessageInput{
QueueUrl: aws.String(queueURL),
MessageBody: aws.String(string(msg)),
})
return err
}Efficiently streaming build logs from AWS CloudWatch to the frontend
Implemented log polling endpoints and frontend polling for near real-time updates
React Query: Poll Build Status (Frontend)
const { data, refetch } = useQuery(['deployment', id], () => fetchDeployment(id), {
refetchInterval: (data) => data?.status === 'building' ? 2000 : false,
});Ensuring atomic deployment state transitions and preventing race conditions
Employed DynamoDB transactions and conditional updates for atomic state changes
DynamoDB Transaction for Deployment State
// Atomically update deployment status
_, err := dynamoClient.TransactWriteItems(context.TODO(), &dynamodb.TransactWriteItemsInput{
TransactItems: []types.TransactWriteItem{
{
Update: &types.Update{
TableName: aws.String(deploymentsTable),
Key: map[string]types.AttributeValue{
"id": &types.AttributeValueMemberS{Value: deploymentID},
},
UpdateExpression: aws.String("SET #status = :newStatus"),
ExpressionAttributeNames: map[string]string{
"#status": "status"
},
ExpressionAttributeValues: map[string]types.AttributeValue{
":newStatus": &types.AttributeValueMemberS{Value: newStatus},
},
ConditionExpression: aws.String("#status = :expected"),
ExpressionAttributeValues: map[string]types.AttributeValue{
":expected": &types.AttributeValueMemberS{Value: expectedStatus},
},
},
},
},
})Handling custom domain routing and SSL termination at scale
Leveraged CloudFront and Lambda@Edge for dynamic subdomain and custom domain routing