Deploying to Vercel without linking a repository
Apr 25, 2024
Vercel is really convenient platform for hosting JavaScript oriented projects. It has a ton of features and great developer experience (DX) when it comes to building, deploying, and potentially scaling your website or app. But sometimes that great DX gets in the way because you’re not following the happy path.
For instance, say you wanted to deploy to Vercel without having to link your repository to their platform. Perhaps there are security concerns, you’re using a hosted Git provider that’s not supported, or maybe not even using Git. 😱 Or perhaps you’re running a monorepo and only want to deploy one application (of many) to Vercel without exposing the other applications. If you find yourself in any of these situations among others, Vercel’s happy path probably won’t work for you.
Luckily, there is a way around all of this! Vercel has a handy CLI that allows you to create a Vercel project (without linking a repository) and deploy your code to Vercel.
Installing the Vercel CLI
The first thing you’ll need to do is install the Vercel CLI. You can either do this globally or locally in your project. For the sake of this guide, we’ll approach things from the local standpoint.
Assuming you have Node.js and npm installed, run the following command in your project:
Then you can run the following to make sure the CLI has been successfully installed:
This should print the version of the Vercel CLI that was installed. Great! We’ve installed the Vercel CLI, now we need to set up our Vercel project.
Creating a Vercel project
A Vercel project is necessary to deploy to Vercel. Normally, you’d create a project by logging into the Vercel web app and linking an existing hosted Git repository. The Vercel CLI allows you to create new projects without having to do that.
First, you’ll need to authenticate to Vercel using the CLI:
This will prompt you to authenticate using a variety of methods:
After you’ve successfully authenticated, you should see the something like the following message in your terminal:
Now, we can create our Vercel project with the CLI:
This will initiate a prompt to set up a Vercel project. Once you get to the step where it asks you if you want to link to an existing project, enter n
for no. You will then be prompted to enter a name for your project and where your code is located (usually, this should be the root of your project).
The Vercel CLI will then analyze your project and auto-detect some project settings such as the build command and the output directory. You are free to update these settings as you see fit.
Once you’ve confirmed your project’s settings, the Vercel CLI will attempt to build and deploy your project to a preview URL. This is an opportunity to see if everything is working properly, but you can abort this process by pressing ctrl+c
.
You’ll notice that a new directory has been added to your project at .vercel
. This directory houses files necessary for the Vercel CLI to build and deploy your project. Take a look at .vercel/project.json
to see which Vercel project is associated with your local project. You’ll also find any project settings you’ve customized here.
If you are tracking your project with Git, it may be appropriate to add the .vercel
directory and its contents to your .gitignore
so you don’t leak any details about your Vercel deployments.
Next up, we’ll go over how to build and deploy your project to Vercel.
Building and deploying to Vercel
Now that you have your Vercel project set up, you can now deploy with a simple command:
This will build your project using your project’s build settings and deploy it to a preview URL on Vercel. A preview URL allows you to preview the result of your deploy without touching what is already at your production URL. This is a great way to stage your deployment for testing. The Vercel CLI will output the resulting preview URL:
To deploy to your production URL, run the same command with the --prod
flag:
The Vercel CLI will output the resulting production URL:
You’ll notice that when you use the vercel deploy
command, you aren’t actually building the your project on your local machine. If you look at the logs for each deploy via the provided inspect URL, you’ll actually see that the builds occur on Vercel’s servers. This means that you’re actually uploading your project’s source files to Vercel on each deploy which may or may not be what you want. Let’s go over how to build locally and only send our built project to Vercel.
First, you’ll need to build your project using the Vercel CLI:
This will build your project using the settings you specified earlier and place the built files in .vercel/output
.
Now let’s deploy the built files to Vercel:
The --prebuilt
flag will signal to the Vercel CLI that you have already built the project locally and only want to deploy those files (and not your source files) to Vercel. The Vercel CLI will spit out a preview URL just like before.
Now let’s deploy to production. We can use the same commands, but with the --prod
flag instead:
Awesome, we’ve now built our project locally and deployed those files to Vercel without having to expose our source code! Next, let’s go over how to integrate this deploy process more tightly in our project.
Creating a deploy command
So far, we’ve been using npx
to run all of our deploys. This works, but we can actually make the process more streamlined for our project by rolling up the npx
commands into a package.json
script.
In our project’s package.json
, we can define some new scripts:
Note how we’ve added two new scripts: deploy
and deploy:preview
. Running npm run deploy
will do a production URL build and deploy while npm run deploy:preview
will do a preview URL build and deploy.
Next steps
Today we went over how to install the Vercel CLI, set up a Vercel project (without linking a Git repository), deploy a project to Vercel, and build and deploy a project to Vercel without exposing our source code.
I use this workflow almost daily for generating preview URLs for prototypes or small projects that I can distribute to stakeholders without having to push the code up to a hosted Git provider like GitHub. It affords me more control over my source code and when deploys happen (at the cost of convenience).
To get even closer to the great DX and convenience that Vercel provides, you could integrate this deploy mechanism into a CI/CD process like GitHub actions. The Vercel CLI also offers a ton of other functionality, like the ability to inspect deploys, retrieve logs, and even rollback deploys! I’d highly recommend checking out the documentation to learn more.