
Prerequisites
Before you begin, make sure you have the following:- A GitHub account
- A Tinybird account
- An Upstash account
- A PlanetScale account
- A Vercel account
- Either a Cloudflare or AWS account
acme.com as a placeholder for your custom domain, and ac.me as a placeholder for your custom short domain.
Step 1: Local setup
First, you’ll need to clone the Dub repo and install the dependencies.Clone the repo
Install dependencies
Remove unnecessary files
apps/web/vercel.json file since cron jobs are not required for the self-hosted version:Set up environment variables
.env.example file to .env. You can start filling in the first few environment variables:Step 2: Set up Tinybird Clickhouse database
Next, you’ll need to set up the Tinybird Clickhouse database. This will be used to store time-series click events data.Create Tinybird Workspace
admin Auth Token. Paste this token as the TINYBIRD_API_KEY environment variable in your .env file.Install Tinybird CLI and authenticate
packages/tinybird directory.Install the Tinybird CLI with pip install tinybird-cli (requires Python >= 3.8).Run tb login and paste your admin Auth Token.Publish Tinybird datasource and endpoints
tb deploy to publish the datasource and endpoints in the packages/tinybird directory. You should see the following output (truncated for brevity):Set up Tinybird API base URL
TINYBIRD_API_URL environment variable in your .env file.Step 3: Set up Upstash Redis database
Next, you’ll need to set up the Upstash Redis database. This will be used to cache link metadata and serve link redirects.Create Upstash database

Set up Upstash environment variables
UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN from the REST API section into your .env file.
QSTASH_TOKEN, QSTASH_CURRENT_SIGNING_KEY, and QSTASH_NEXT_SIGNING_KEY from the Request Builder section into your .env file.
Step 4: Set up PlanetScale MySQL database
Next, you’ll need to set up a PlanetScale-compatible MySQL database. This will be used to store user data and link metadata.Create PlanetScale database

Set up PlanetScale environment variables
DATABASE_URL into your .env file.
Generate Prisma client and create database tables
apps/web/prisma/schema.prisma and replace all the columns in the DefaultDomains model to the normalized version of your custom short domain (removing the . character).For example, if your custom short domain is ac.me, your DefaultDomains model should look like this:apps/web directory and run the following command to generate the Prisma client:Step 5: Set up GitHub OAuth
Next, create a new GitHub App. This will allow you to sign in to Dub with your GitHub account. Don’t forget to set the following Callback URLs:https://app.acme.com/api/auth/callback/githubhttp://localhost:8888/api/auth/callback/githubfor local development.
Client ID and Client Secret into your .env file as the GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET environment variables.
Step 6: Set up Cloudflare R2
Dub stores user-generated assets in either S3 or S3-compatible services like Cloudflare R2. These include:- Project logos
- User avatars
- Custom Social Media Cards images
Create R2 bucket
dubassets) and leaving the remaining settings as is.
Set up access to R2


Access Key ID and Secret Access Key values – you’ll need them in the next step.Set up R2 environment variables
.env file:Set up R2 domain
STORAGE_BASE_URL in your .env file to the domain you chose.
Step 7: Set up Resend (optional)
- Sign up for Resend and create your API key here.
- Copy the API key into your
.envfile as theRESEND_API_KEYenvironment variable. - You’ll then need to set up and verify your domain by following this guide here.
Step 8: Set up Unsplash (optional)
Dub uses Unsplash’s API for the Custom Social Media Cards feature. You’ll need to set up an Unsplash application to get an access key.
UNSPLASH_ACCESS_KEY env var.
Step 9: Deploy to Vercel
Once you’ve set up all of the above services, you can now deploy your app to Vercel.Deploy code to GitHub
Create a new Vercel project
apps/web.
.env file by copying all of them and pasting it into the first input field. A few notes:- Remove the
PROJECT_ID_VERCELenvironment variable for now since we will only get the project ID after deploying the project. - Replace the
NEXTAUTH_URLenvironment variable with the app domain that you will be using (e.g.https://app.acme.com).
Add required environment variables
PROJECT_ID_VERCEL environment variable – both in your .env file and in your newly created Vercel project’s settings (under Settings > Environment Variables)Add both the NEXT_PUBLIC_APP_DOMAIN and NEXT_PUBLIC_APP_SHORT_DOMAIN as domains in your Vercel project’s settings (under Settings > Domains). You can follow this guide to learn how to set up a custom domain on Vercel.Redeploy your Vercel project
https://app.acme.com) and see the following login page:
Caveats
This guide is meant to be a starting point for self-hosting Dub. It currently depends on the following services to work:- Tinybird for the analytics database
- Upstash for the Redis database
- PlanetScale for the MySQL database
- Vercel for hosting & Edge Middleware
