React 19 + Vite portfolio with interactive visuals, project case studies, contact links, and Netlify Functions for reviews, AI-assisted review drafts, and resume-view counting.
- Build command:
npm run build - Publish directory:
dist - Functions directory:
netlify/functions - Node runtime: 22
- Routing:
netlify.tomlmaps/api/*to Netlify Functions and falls back toindex.htmlfor client-side routes.
Connect MuhammadMinhaj229/portfollio to Netlify and use these settings. Keep the base directory empty unless you intentionally build from a subdirectory.
Configure these in Netlify → Site configuration → Environment variables:
UPSTASH_REDIS_REST_URL— Upstash Redis REST endpoint.UPSTASH_REDIS_REST_TOKEN— Upstash Redis REST token.GEMINI_API_KEY— Google Gemini API key for optional review assistance.GEMINI_MODEL— optional model override; defaults togemini-2.5-flash.
Never commit secret values or expose provider keys in client code. Static content loads without optional services; reviews and resume counting need Redis, and AI assistance also needs Gemini.
npm ci
npm run dev
npm run lint
npm run buildAfter deployment, verify the home page, direct refreshes, resume download, contact form, and /api/resume-views, /api/reviews, and /api/review-assist. The contact form uses FormSubmit and may require first-time recipient confirmation.
- Server errors return generic messages instead of provider/runtime details.
- Review fields are bounded and submission attempts are rate-limited via Redis per client IP.
- Rate limiting complements, rather than replaces, managed bot protection/WAF controls.
- Public user-generated review content should be moderated before being presented as endorsed testimonials.