Requirements
The server, database, domain and provider accounts LinkNest needs, where it can be hosted, and what each optional account adds.
4 min readUpdated Oct 17, 2026Applies to LinkNest 1.0.0
On this page
At a glance
| You need | Required for | Notes |
|---|---|---|
| Node.js 22 | Everything | The Docker image is built on node:22-slim. |
| Postgres | Production | Any Postgres you can reach over TCP. The package's notes ask for Postgres 15 or newer and recommend Neon. Without one, an in-memory database is used and wiped on restart. |
| A domain with HTTPS | Production | Sign-in cookies are __Host- cookies marked Secure, which browsers only accept over HTTPS (with an exception for localhost). |
| A host for one Node process | Production | A VPS or container host running the Dockerfile, or Vercel. See Where it can run. |
| Stripe, PayPal or Razorpay | Optional | Paid plans, tips and product sales. Any one is enough; all three can be on at once. |
| xAI API key | Optional | The AI page co-pilot. Without it the co-pilot uses a built-in rule-based planner. |
| Resend account | Optional | Lets creators email their subscribers. Without it a broadcast is saved for the creator to copy. |
Nothing else is needed: there is no Redis, no queue worker, no object storage and no SMTP server. Uploaded pictures (avatars, link images, logos) are resized in the browser and stored in Postgres.
Where it can run
LinkNest builds for two targets, chosen at build time by NITRO_PRESET:
| Target | How | Good to know |
|---|---|---|
| Docker on a VPS (Coolify, plain Docker, any container host) | The included Dockerfile sets NITRO_PRESET=node-server and runs the migrations every time the container starts |
You put an HTTPS reverse proxy in front of it. Installation covers this path. |
| Node on a VM without Docker | Build with NITRO_PRESET=node-server, run node .output/server/index.mjs under systemd or a process manager |
Same as Docker, minus the image. |
| Vercel | The default when NITRO_PRESET is unset |
npm run build migrates the database during the build, so DATABASE_URL must be available at build time. |
Important
If you run vite build or npm run build on a server without setting NITRO_PRESET=node-server, you get a Vercel build in .vercel/output, not a server you can start with node. The Dockerfile already sets it.
Shared PHP hosting cannot run it: it needs a Node 22 process.
Database
- Postgres, any provider. Self-hosted, Neon, Supabase, RDS and similar all work through the standard
pgdriver. No extensions are used. - Migrations run at container start. The
Dockerfilerunsnode scripts/migrate.mjsbefore the server starts. On Vercel,npm run buildruns it. Applied files are recorded in a_migrationstable and never run twice. - One database per install. The runner takes no lock, so do not start several containers against a fresh database at the same moment. Start one, let it migrate, then scale.
For a first look you can skip Postgres. Without DATABASE_URL, LinkNest starts an embedded Postgres (PGLite) in memory and applies the same migrations to it. Everything works, and everything is wiped when the process restarts.
Warning
This fallback also applies in production. A container started without DATABASE_URL runs happily on the in-memory database, accepts sign-ups and loses all of it on the next restart. Check the variable before you announce the site.
Domain and HTTPS
LinkNest does not terminate TLS itself. Put it behind something that does: Caddy, nginx with Let's Encrypt, Coolify's proxy, a load balancer or Vercel.
HTTPS is required in production because:
- Session cookies are named
__Host-grok-auth.*and markedSecure. On plain HTTP, sign-in appears to work and the session is then dropped. - Better Auth only accepts sign-in requests from origins it trusts:
BETTER_AUTH_URL,https://plusVITE_PUBLIC_HOSTNAME,localhost:8080and any*.vercel.apphost. - Stripe, PayPal and Razorpay deliver webhooks to
https://<your-domain>/api/....
If you offer custom domains to creators, your proxy also has to serve HTTPS for each of their domains. See Custom domains.
Provider accounts
| Provider | What it powers | Required? |
|---|---|---|
| Stripe | Plan subscriptions with a customer portal, tips and product sales | Optional |
| PayPal | Plan subscriptions, tips and product sales | Optional |
| Razorpay | Plan subscriptions and payment links for tips and products, in INR or USD | Optional |
| xAI | The AI page co-pilot | Optional |
| Resend | Email broadcasts to a creator's subscribers | Optional |
Note
Tips and product sales are paid into your gateway account, not the creator's. LinkNest records what each creator earned and lets them request a payout, which you then pay by hand. Earn and payouts explains the flow and what it means for you.
Analytics location data
Insights show each visit's country, region and city. Those come from request headers that Vercel adds (x-vercel-ip-*) or, for the country only, from Cloudflare (cf-ipcountry). On a VPS without either, the country is guessed from the visitor's browser timezone and the city is left empty. See Analytics.
Local development
For a laptop install you only need Node.js 22 and npm. Postgres, keys and a domain can all come later. Quick start walks through it.