Web Deploy - NowStack Mobile
SkillCloud & infraDeploy the NowStack Mobile web app to production on Vercel with the Convex backend shipped alongside it. Use when the user says "deploy my app", "deploy the web app", "ship to production", "go live", or needs CONVEX_DEPLOY_KEY / the Vercel build wired so the backend never drifts behind the frontend.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Web Deploy - NowStack Mobile skill
What this skill tells your AI
The instructions your AI receives, as published by melvynx/saveit.now in .agents/skills/ns-web-deploy/SKILL.md and read by ahel’s review.
Deploy web-app/ (TanStack Start) to Vercel so that Convex and the frontend ship together on every commit. The Vercel build runs convex deploy first, then builds the site — without this, the frontend ships against a stale backend. Run these steps IN ORDER; never skip the deploy-key step (Step 2 is the one teams forget).
npm run check-setup # "web-app/vercel.json" AND "web-app nitro plugin" checks MUST pass
web-app/vercel.jsonrunsnpm run build:vercel→cd .. && npx convex deploy --cmd 'cd web-app && npm run build' --cmd-url-env-var-name VITE_CONVEX_URL.- The
nitrohost preset is wired so SSR routes serve on Vercel.
If either is missing (older project), restore them:
// web-app/vercel.json
{ "installCommand": "npm install && npm --prefix .. install", "buildCommand": "npm run build:vercel" }
// web-app/package.json scripts:
// "build:vercel": "cd .. && npx convex deploy --cmd 'cd web-app && npm run build' --cmd-url-env-var-name VITE_CONVEX_URL"
// web-app/vite.config.ts — add the nitro plugin (after tanstackStart(), before react()/tailwind())
import { nitro } from "nitro/vite";
// plugins: [ tanstackStart({...}), nitro(), viteReact(), tailwindcss() ]
// and add "nitro": "^3.0.260610-beta" to web-app dependencies, then `cd web-app && npm install`.
Sanity-check locally that the build emits the Vercel output (Node 22):
cd web-app && VERCEL=1 npm run build # must end with "Generated .vercel/output/nitro.json"; trash .vercel/output after
setup:vercel (scripts/setup-vercel-convex.mjs):
- Sets the Vercel project Root Directory =
web-appautomatically via the Vercel API (using the token the CLI already stored), so Vercel readsweb-app/vercel.json. If it can't (no token), it prints the one manual step. - Mints a Convex production deploy key (
convex deployment token create --prod) and setsCONVEX_DEPLOY_KEY(Production) +VITE_CONVEX_SITE_URL(auth) +VITE_EMAIL_CONTACTon Vercel.
Idempotent — safe to re-run; npm run setup:vercel -- --force rotates the key.
Link at the repo root (not web-app/) so a CLI deploy uploads the whole monorepo. Root Directory = web-app then makes Vercel build inside web-app/, where .. reaches the root convex/ folder.
Prefer the dashboard? Convex → Settings → Deploy keys → "Generate production deploy key", add it to Vercel as CONVEX_DEPLOY_KEY (Production), and set Root Directory = web-app under Settings → Build & Deployment.
git push origin main
CLI alternative — from the REPO ROOT with --archive=tgz:
vercel --prod --archive=tgz # repo root, NOT web-app/ (see <critical>)
Confirm in the build log that Convex deployed and Nitro produced the Vercel output:
> cd .. && npx convex deploy --cmd 'cd web-app && npm run build' --cmd-url-env-var-name VITE_CONVEX_URL
- Running 'cd web-app && npm run build' with environment variables "VITE_CONVEX_URL" and "CONVEX_SITE_URL" set...
✓ built in ...
ℹ Generated .vercel/output/nitro.json # ← the Nitro→Vercel preset ran
Then check the deployment is Ready and hit the routes (a SPA-404 regression only shows here, not in the build):
for p in / /privacy /cgv /support /app /admin; do
echo "$p -> $(curl -s -o /dev/null -w '%{http_code}' https://<your-domain>$p)"
done
# every public route must be 200 (not 404). Sign in and confirm /app and /admin.
<failure_modes>
- Site deployed but every route 404s (NOT_FOUND) → the
nitroplugin is missing, so Vercel served a SPA. Wirenitro()(Step 1) and redeploy. The build log will NOT show "Generated .vercel/output" when it's missing. Error: Invalid request: 'files' should NOT have more than 15000 items→ you deployed the monorepo inline from the repo root. Add--archive=tgz, or just push tomain.Command "npm install && npm --prefix .. install" exited with 254→ you ranvercel --prodfromweb-app/, so onlyweb-app/uploaded and..is empty. Deploy from the repo root (with--archive=tgz) or push tomain.- Build error: "no Convex deployment configuration found / CONVEX_DEPLOY_KEY" → run Step 2 (
npm run setup:vercel). The classic "web deployed but Convex never updated" bug. - Vercel ignores the build command → Root Directory is not
web-app, soweb-app/vercel.jsonis not read. Re-runnpm run setup:vercel(it sets it) or fix it in project settings. - Frontend can't reach the backend in prod →
VITE_CONVEX_URLwas hardcoded to a dev URL, or the deploy ran without the key. Re-run Step 2 and redeploy. convex deploycan't find functions → the build did notcd ..; theconvex/folder lives at the repo root, not inweb-app/. </failure_modes>
<success_metrics>
npm run check-setup"web-app/vercel.json" AND "web-app nitro plugin" checks pass.CONVEX_DEPLOY_KEY(Production) +VITE_CONVEX_SITE_URLset on Vercel; Root Directory =web-app.- A production build log shows
convex deployrunning, then the frontend build, thenGenerated .vercel/output/nitro.json, and the deployment is Ready. - Every public route (
/,/privacy,/cgv,/support) returns 200 — not 404. - No secret committed or printed. </success_metrics>
Signals
- GitHub stars
- 31
- Forks
- 5
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
ns-web-deploy- Source
- github.com/melvynx/saveit.now