Guide 1 of 4
Install
Publish your site in about 5 minutes, in your browser
You need: Node.js 20+ and a free Vercel account.
Time: about 5 minutes. You will be asked for one thing — what to call your project. Everything else, including the database, is set up for you.
The short version
npm install
npm run setup
Choose 1) Publish my portfolio, and follow along. That's it.
What the wizard does
Four steps, all automatic:
| Step | What happens |
|---|---|
| 1. Sign in to Vercel | Opens your browser. A free account is fine. |
| 2. Create your project | You pick the name. It becomes your address: my-portfolio → https://my-portfolio.vercel.app |
| 3. Add your database | Creates a Convex database on its free plan and connects it to your project. You don't sign up for anything or copy any keys. |
| 4. Deploy | Builds your site, creates the database tables, and goes live. |
You'll be offered a database region. Default is the right answer unless you have a reason otherwise — note that Europe carries a 30% surcharge on usage.
Nothing to configure
The old way to install software like this was to copy database URLs and secret keys between two dashboards. Nexfolio doesn't ask, because it works them out during the build:
| Setting | Where it comes from |
|---|---|
CONVEX_DEPLOY_KEY | Added when the wizard provisions your database |
NEXT_PUBLIC_CONVEX_URL | Derived from that key at build time |
NEXT_PUBLIC_CONVEX_SITE_URL | Derived from the URL above |
NEXT_PUBLIC_SITE_URL | Your Vercel production domain |
SITE_URL (database) | Set on first deploy by scripts/bootstrap-convex-env.mjs |
BETTER_AUTH_SECRET | Generated on first deploy, stored server-side, never printed |
Setting any of these manually in Vercel overrides the automatic value — that's
how custom domains work. See after-setup.md.
Create your admin account
When the wizard finishes, open your new site:
- Go to
/admin/seedand click Create admin account - Sign in at
/adminwithadmin@example.com/password1234
Then secure it — don't skip this
Those credentials are printed in the docs, so anyone could guess them.
/admin/settings→ Change password/admin/settings→ Danger zone → turn off the admin seed route
A red banner shows across the admin until step 4 is done. It's telling the truth: while that route is on, a stranger could create an admin account on your site.
Make it yours
You're live. Everything from here is content, edited in the browser:
- Pages — homepage text, section titles, SEO
- Projects, Career, Skills, Certificates, Blog
- Site branding — name, logo, colours, template
- Social links and Contact info
Want to see a finished site first? Settings → Danger zone → Seed demo content fills everything with realistic examples. It wipes existing content, so only do it before you've added your own.
Next: after-setup.md — custom domain and go-live checks.
Rather not use a terminal?
The same thing can be done entirely in the Vercel dashboard:
- Go to vercel.com/new and upload this folder, or import it from your own Git repository
- The first build will fail — the database doesn't exist yet. Expected.
- In the project: Storage → Create Database → Convex → Free plan → Connect
- Deployments → Redeploy
- Create your admin account as described above
The wizard is recommended because it avoids that failed first build and doesn't depend on where Vercel happens to put a menu.
Advanced: doing it manually
Everything below is what the wizard does for you. You only need this if the wizard fails, you're scripting a deploy, or you're curious.
npx vercel login
npx vercel link --project my-portfolio --yes
npx vercel integration add convex \
--name my-portfolio --plan CONVEX_BASE \
-m region=default -e production -e preview
npx vercel --prod
Two things that aren't obvious:
CONVEX_BASEis the free plan's ID, notfree. Runnpx vercel integration add convex --helpfor the current list — the IDs don't match the names shown in the dashboard.- Provision the database before the first deploy. That's why the wizard
succeeds on the first build while the dashboard route doesn't:
CONVEX_DEPLOY_KEYhas to exist before the build runs.
-m region=default puts the database in the US. aws-eu-west-1 exists but
carries a 30% usage surcharge, and Vercel functions are US-hosted by default.
What the build itself does
vercel.json overrides the build command:
node scripts/bootstrap-convex-env.mjs && npx convex deploy --cmd 'npm run build'
bootstrap-convex-env.mjs sets SITE_URL and generates BETTER_AUTH_SECRET on
the Convex deployment if missing, then no-ops on later builds. The --cmd form
wraps the frontend build so Convex can inject the URLs into it — chaining with
&& instead would skip that injection.
Other paths
- Running it on your own machine →
npm run setup, then choose 2) Set up local development - Something went wrong →
troubleshooting.md