Step by step
-
Check your project type
- Static / SPA (Vite, Astro, plain HTML): Build produces a folder of HTML/JS/CSS (dist/, build/, out/).
- Next.js / SSR framework: next.config.* or a server adapter.
- Long-running server (Express, FastAPI, bots, websockets): A start command like node server.js or uvicorn that must keep running.
-
Get the code onto GitHub
- Create a GitHub repo and push (Cursor's Source Control panel or git in the terminal).
-
Create the project on DigitalOcean App Platform
Control Panel → Apps → Create App, pick GitHub/GitLab as the source and the branch; App Platform detects the runtime.
-
Check the build settings
If Output Directory is empty, App Platform scans for
_static,dist,public,build.For Cursor: build command
Whatever package.json says (usually npm run build), output Depends on framework. -
Add environment variables before the first build
In DigitalOcean App Platform: App → Settings → App-level environment variables (choose build-time scope for
VITE_*values). Copy these from Cursor:-
Everything in your local .env — never commit it; add each value in the host dashboard.
Changed a value later? Rebuild. Vite bakes variables in at build time. Troubleshoot missing env vars
-
-
Make page refreshes work (Vite / React Router single-page apps)
App → Settings → your static site → Custom Pages # Custom Pages → Catchall → Page Name: index.htmlServer-rendered projects (TanStack Start, Next.js) don't need this. DigitalOcean App Platform docs (opens in a new tab)
-
Update login redirect URLs
Add your new DigitalOcean App Platform URL (and later your custom domain) to your auth provider's allowed URLs. Redirect troubleshooting
-
Add your domain
App → Settings → Domains → Add domain, then point DNS as instructed (or let DigitalOcean manage DNS).
What it will cost
Free tier Free: 3 static-site apps, 1 GiB outbound transfer per app per month. Paid from $5/mo: Containers from $5/month (1 shared vCPU, 512 MiB, 50 GiB transfer). Dev database $7/month. Checked 17 Oct 2026 on DigitalOcean App Platform's pricing page (opens in a new tab).
- 1 GiB/month of transfer is small — a popular static app will pay overage or should live on Cloudflare Pages.