Deploy
Deploy your own
Three ways, easiest first. The first two need no terminal and take about five minutes.
One click
Option one · nothing to install
One click
Vercel copies this repository into your own GitHub account, provisions a free Neon Postgres database and a blob store for your images, and asks you to invent one setup phrase. You never see a key.
Then open the address it gives you, claim the site with your setup phrase, and answer four questions. You can point your own domain at it whenever you like, and nothing you have written is affected when you do.
If the button ever stops provisioning the database, deploy anyway and add Neon and Blob from your project’s Storage tab. The backend is chosen from whichever environment variables are present, so nothing else changes.
Read this before using the free plan for paid work
Vercel’s Hobby plan is "restricted to non-commercial personal use only", and their definition of commercial usage includes "advertising the sale of a product or service" and asking for donations.
If your portfolio advertises work you are paid for, budget for Vercel Pro or use one of the options below. The full discussion is on what it costs.
One command
Option two · any machine with Docker
One command
A rented server, an old laptop, a Raspberry Pi. App and database together, no account anywhere, nothing that phones home.
git clone https://github.com/ShadmanArafin/open_portfolio.git
cd open_portfolio
docker compose upOpen http://localhost:3000 and follow the setup. Change OPB_SETUP_TOKEN and OPB_SECRET_KEY in docker-compose.yml first.
Keep the volume. /data is where your uploads live — and your content too, if you are not using a database. Without it, replacing the container deletes your site. With it, you can throw the container away and rebuild it as often as you like, which is exactly what updating does.
From source
Option three · to work on it
From source
Node 20.9 or newer. No database needed and no account anywhere — the filesystem backend is the default.
git clone https://github.com/ShadmanArafin/open_portfolio.git
cd open_portfolio
npm ci
npm run devhttp://localhost:3000 sends you to /setup. Content lands in .opb/ — delete that folder to start over.
Backends
Where your content ends up
There is no setting for this. Whichever backend’s environment variables are present is the one used, so provisioning a database is the whole of the configuration.
| Backend | Good for | Files go to |
|---|---|---|
| Local filesystem | Trying it, and a real choice on a VPS or a Pi. Refused in production on hosts that discard the disk, because the failure otherwise is a site that works for a day. | A folder |
| Postgres | Docker Compose, or any Postgres you already run. | A mounted volume |
| Neon + Vercel Blob | What the one-click deploy sets up. | Vercel Blob |
| Supabase | If you are already there. Note the free-tier pausing. | Supabase Storage |
Firebase, Convex, Cloudflare D1 + R2, PocketBase and Appwrite are planned and not built. Each has to pass the same conformance suite against a real instance before it ships, so none of them is offered until it has.