Event management platform (frontend + backend), including the CertVault certificate hosting/verification feature and the Ultron event tooling. Fully standalone — no GradeX dependency.
~/Desktop/Code PlayGround/VentArc— this repo (frontend + API + server)~/Desktop/Code PlayGround/GradeX— separate app; no VentArc code
- Frontend: React + Vite (port 5174)
- Backend: Node + Express (port 3001), serves
/api/certvaultand static build - DB: Convex (backend and data; run
npx convex devto create/link project and getCONVEX_URL) - PDFs: Cloudinary (certificate PDF hosting)
- PDF generation: Optional separate service (certgen) at
CERTGEN_SERVICE_URL(e.g. Flask on 5050)
Copy .env.example to .env and set:
CONVEX_URL— required; runnpx convex devto create a Convex project and get the URLCLOUDINARY_*— for PDF hostingCERTGEN_SERVICE_URL— for generating PDFs (e.g.http://localhost:5050); omit if you only create records without PDFsALLOWED_ORIGINS— comma-separated origins for CORS (e.g.http://localhost:5174)PUBLIC_URL— optional; when set (e.g.https://your-app.up.railway.app), this origin is allowed for CORS. On Railway,RAILWAY_PUBLIC_DOMAINis used automatically if set.
-
Create a new project at railway.app and connect this repo (GitHub/GitLab or deploy from CLI).
-
Configure build & start (optional — repo includes
railway.toml):- Build:
npm ci && npm run build - Start:
node server.js
Railway setsPORT; the app listens on0.0.0.0.
- Build:
-
Set environment variables in the Railway service:
- Required:
CONVEX_URL— runnpx convex devlocally to create a Convex project and get the URL; for production usenpx convex deployand set the production URL. See RAILWAY.md. - For PDF hosting:
CLOUDINARY_CLOUD_NAME,CLOUDINARY_API_KEY,CLOUDINARY_API_SECRET - Optional:
PUBLIC_URL— set to your Railway app URL if CORS blocks requests; Railway may also setRAILWAY_PUBLIC_DOMAIN. - Optional:
CERTGEN_SERVICE_URL— only if you run a separate PDF generator service.
- Required:
-
Generate a domain in Railway (Settings → Networking → Generate Domain). Use this URL as
PUBLIC_URLif needed. -
Convex: Ensure
npx convex dev(ornpx convex deployfor prod) has been run from this repo so your Convex project has the schema and functions. No separate DB migrations — Convex schema is inconvex/schema.js.
After deploy, the app serves the frontend and /api/certvault from the same origin. Sign up, create events, and add certificates; PDF generation works only if CERTGEN_SERVICE_URL points to a running certgen service.
Frontend + backend together:
npm install
npm run dev:all- Frontend: http://localhost:5174 (Vite proxies
/apito backend) - Backend: http://localhost:3001
Or separately:
npm run server # backend on 3001
npm run dev # frontend on 5174 (set Vite proxy to 3001)Build and run production:
npm run build
PORT=3001 node server.jsServes the built app and API from port 3001.
Schema and functions are in convex/. Run npx convex dev to create/link a project and push the schema. No separate migrations — Convex syncs the schema from convex/schema.js.
For generating certificate PDFs from templates, you need the certgen service (e.g. the Flask app in GradeX’s certgen-service/). Run it separately and set CERTGEN_SERVICE_URL in .env. If you don’t need PDF generation, you can leave it unset and only create certificate records.
| Path | Page |
|---|---|
/ |
Home |
/how-it-works |
How it works |
/for-clubs |
For clubs |
/verify |
Verify certificate |
/login |
Club login |
/dashboard |
Club dashboard |
/design |
Certificate design |
/:eventSlug |
Public download |