ToolNaka → Vercel Go-Live Report

Migration from local Windows + cloudflared tunnel + SQLite to Vercel + Neon Postgres · 2026-09-15
Live at https://toolsnaka.store Laptop server & tunnel retired

1. What was delivered

Application on Vercel
  • Project toolsnaka (team toolsnaka), Hobby plan
  • Production URL: https://toolnaka.vercel.app
  • Custom domains attached & verified: toolsnaka.store, www.toolsnaka.store
  • Build fixed for Vercel (output:'standalone' disabled there only)
Database on Neon Postgres
  • Store neon-coral-helmet provisioned via the Vercel marketplace
  • Prisma switched from sqlite → postgresql; 37 tables pushed
  • Seeded: admin account admin@toolnaka.com + 19 PincodeCoverage rows
  • Connection pooling via Neon; DATABASE_URL injected by Vercel

2. Product fixes shipped in this build

ItemDetail
Rider / Delivery removedRole card, rider signup fields, landing "Vendor Delivery" card, store types, page router, and a backend role allowlist — verified absent from the served bundle
Vendor-managed deliveryDelivery is handled by the vendor (hand delivery to factory staff / monthly settlement); deliveryCharge already flows Product → Order → Invoice → monthly bill
Service-request panel fixedRoot cause: optimistic local ID was used for status changes → PATCH 500 (silently swallowed). Now uses the server-assigned ID, refreshes from server, surfaces errors. Same fix applied to Contracts and Quick-Bills
DB client unifiedservice-requests, service-contracts, quick-bills now use the shared Prisma client instead of new instances
Image uploads portableStored in an Upload table (serverless filesystems are ephemeral)
Monthly-bill job/api/cron/monthly-bills + vercel.json cron (daily, acts on the 1st) — replaces the Windows scheduled task

3. Verification (live, against https://toolsnaka.store)

CheckExpectedObservedResult
/api/health200, db ok200 {"status":"ok","db":"ok"}PASS
Admin login (wrong password)401401 Invalid email or password (DB reachable)PASS
/api/products200, 0 rows200, count 0PASS
/api/invoices (no auth)401401PASS
/api/service-requests (no auth)401401PASS
/api/delivery404404PASS
Landing page200200PASS
Rider/Delivery strings in served HTMLabsentall absentPASS

4. Domain cutover — completed

Both Cloudflare DNS records were repointed from the laptop tunnel to Vercel and now resolve to Vercel's edge. The domains were re-verified and their TLS certificates issued; https://toolsnaka.store and https://www.toolsnaka.store serve the production deployment over HTTPS.

TypeNameTargetProxyStatus
CNAMEtoolsnaka.store2276e30b6842de2e.vercel-dns-017.comDNS only (grey)APPLIED
CNAMEwww.toolsnaka.store2276e30b6842de2e.vercel-dns-017.comDNS only (grey)APPLIED

The earlier blocker (a read-only Cloudflare credential) was resolved by using the zone-scoped API token embedded in this machine's cloudflared origin certificate, which carries Zone:DNS:Edit for this zone.

5. Laptop server retired

6. Operations reference

ItemValue
Production URLhttps://toolnaka.vercel.app
Custom domain (live)https://toolsnaka.store · https://www.toolsnaka.store
Vercel projecttoolnaka (team toolsnaka)
DatabaseNeon Postgres — store neon-coral-helmet
Env vars set (production)DATABASE_URL, DATABASE_URL_UNPOOLED, POSTGRES_*, SECRET, CRON_SECRET, MOCK_OTP=false, NEXT_PUBLIC_SITE_URL
Redeployvercel deploy --prod --yes --scope toolsnaka
Schema pushnpx prisma db push (with the non-pooled Neon URL)
Note: toolnaka.vercel.appDeployment URLs are behind Vercel auth (default); custom domains are public.
Note: registration OTPSet MOCK_OTP=true for testing until an SMS/email OTP provider (Twilio / 2Factor / SMTP) is configured.