ShowVerse is a full-stack movie booking app with a modern React frontend, a scalable Express API, Clerk authentication, and MongoDB persistence.
- Frontend (Vercel): https://show-verse.vercel.app/
- Backend (Render): https://showverse-backend.onrender.com/
- Backend health: https://showverse-backend.onrender.com/api/health
- Browse movies and available shows
- Seat selection and booking flow
- Favorites and booking history for users
- Admin dashboard for show management
- Clerk-powered authentication
- Stripe webhook endpoint support
- Inngest event endpoint support
Vercel (React + Vite) ---> Render (Express API) ---> MongoDB Atlas
| |
+---- Clerk auth --------+
- Frontend: React 19, Vite 6, React Router, Tailwind CSS 4, Clerk React, Axios
- Backend: Node.js (ESM), Express 5, Mongoose, Clerk Express, Inngest, Stripe, Nodemailer
- Infrastructure: Vercel (frontend), Render (API), MongoDB Atlas (DB)
ShowVerse/
client/ # Frontend app (React + Vite)
server/ # Backend app (Express + MongoDB)
README.md
git clone <your-repo-url>
cd ShowVerse
cd client && npm install
cd ../server && npm installVITE_CLERK_PUBLISHABLE_KEY=pk_test_...
VITE_BASE_URL=http://localhost:3000
VITE_CURRENCY=$
VITE_TMDB_IMAGE_BASE_URL=https://image.tmdb.org/t/p/originalFor local frontend + deployed backend testing:
VITE_BASE_URL=https://showverse-backend.onrender.comMONGODB_URI=mongodb+srv://USERNAME:PASSWORD@CLUSTER.mongodb.net/ShowVerse?retryWrites=true&w=majority
CLERK_SECRET_KEY=sk_test_...
TMDB_API_KEY=...
CORS_ORIGINS=http://localhost:5173,https://show-verse.vercel.app
PORT=3000Optional variables:
STRIPE_SECRET_KEYSTRIPE_WEBHOOK_SECRETSMTP_USERSMTP_PASSSENDER_EMAIL
Terminal 1:
cd server
npm run serverTerminal 2:
cd client
npm run dev- Create a new Render Web Service from this repo
- Set root directory to
server - Build command:
npm install - Start command:
npm start - Add required environment variables
- Ensure MongoDB Atlas network access allows Render
Verify:
GET /returnsServer is Live!GET /api/healthreturnssuccess: trueanddatabase: connected
- Import repository in Vercel
- Set root directory to
client - Build command:
npm run build - Output directory:
dist - Add all required
VITE_*environment variables - Deploy and use the generated
.vercel.appdomain
- Frontend uses
VITE_CLERK_PUBLISHABLE_KEY - Backend uses
CLERK_SECRET_KEY - Never expose
CLERK_SECRET_KEYto client apps - Frontend
VITE_BASE_URLmust point to the live backend:https://showverse-backend.onrender.com
- Open Clerk Dashboard → your ShowVerse app → Users
- Open the exact user you log in with on the website
- Go to Metadata
- Edit Private metadata (Public also works as fallback) to:
{
"role": "admin"
}- Save
- On the website: logout, then login again
- Open
/admin
If admin page still fails, confirm Render has the matching CLERK_SECRET_KEY
from the same Clerk application as the frontend publishable key.
Base URL: https://showverse-backend.onrender.com
GET /- Service livenessGET /api/health- Service and DB healthGET /api/show/all- All showsGET /api/show/:movieId- Shows by movieGET /api/admin/is-admin- Admin check (auth required)GET /api/user/favorites- User favorites (auth required)
- Blank frontend:
- Check
VITE_CLERK_PUBLISHABLE_KEYexists in frontend env
- Check
- API timeout / empty backend behavior:
- Validate
MONGODB_URIand Atlas network access
- Validate
- CORS errors:
- Add frontend domain to
CORS_ORIGINS
- Add frontend domain to
- Auth failures on protected routes:
- Verify
CLERK_SECRET_KEYin backend environment
- Verify
- Missing
/api/health:- Redeploy backend with latest commit
- Do not commit real secrets in
.envfiles - Rotate keys immediately if accidentally exposed
- Keep
CLERK_SECRET_KEYserver-side only
ISC