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:

StepWhat happens
1. Sign in to VercelOpens your browser. A free account is fine.
2. Create your projectYou pick the name. It becomes your address: my-portfoliohttps://my-portfolio.vercel.app
3. Add your databaseCreates 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. DeployBuilds 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:

SettingWhere it comes from
CONVEX_DEPLOY_KEYAdded when the wizard provisions your database
NEXT_PUBLIC_CONVEX_URLDerived from that key at build time
NEXT_PUBLIC_CONVEX_SITE_URLDerived from the URL above
NEXT_PUBLIC_SITE_URLYour Vercel production domain
SITE_URL (database)Set on first deploy by scripts/bootstrap-convex-env.mjs
BETTER_AUTH_SECRETGenerated 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:

  1. Go to /admin/seed and click Create admin account
  2. Sign in at /admin with admin@example.com / password1234

Then secure it — don't skip this

Those credentials are printed in the docs, so anyone could guess them.

  1. /admin/settings → Change password
  2. /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:

  1. Go to vercel.com/new and upload this folder, or import it from your own Git repository
  2. The first build will fail — the database doesn't exist yet. Expected.
  3. In the project: Storage → Create Database → Convex → Free plan → Connect
  4. Deployments → Redeploy
  5. 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_BASE is the free plan's ID, not free. Run npx vercel integration add convex --help for 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_KEY has 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 machinenpm run setup, then choose 2) Set up local development
  • Something went wrongtroubleshooting.md