React + Vite portfolio site with a Firebase-backed blog/admin and a Gemini-powered portfolio assistant.
npm install
npm run devDefault local ports:
- Frontend (Vite):
http://localhost:8000 - Backend (Express):
http://localhost:4001
This repository is split into clear layers:
src/:
- React UI layer for portfolio, blog, admin, and chatbot panel.
server.js:
- Express runtime layer for static hosting, Firebase config delivery, uploads, and chatbot orchestration APIs.
chatbot/:
- Chatbot product layer (architecture, prompts, knowledge, schemas, API contract notes, UI behavior docs).
media/:
- Static media assets (images, PDFs, certificates, etc.).
.github/workflows/:
- CI and deployment automation.
| Path | Responsibility |
|---|---|
src/main.jsx |
React app bootstrap and router mount |
src/App.jsx |
Route table (/, /home, /blog, /admin) |
src/Pages/Portfolio/ |
Main portfolio page composition |
src/Pages/Hero/ |
Hero section + animated background presentation |
src/Pages/About/ |
Bio/positioning content section |
src/Pages/Credentials/ |
Credential/certification rendering + modal view |
src/Pages/Projects/ |
Featured projects carousel and project links |
src/Pages/Skills/ |
Skills and tools presentation |
src/Pages/Contact/ |
Contact links and form UI |
src/Pages/Footer/ |
Footer links and identity |
src/Pages/Blog/ |
Public blog feed and post modal rendering |
src/Pages/Admin/ |
Admin auth, dashboard, content management, secret rotation UI |
src/Components/Navbar/ |
Main site navigation |
src/Components/Chatbot/ |
Chatbot UI adapter (session bootstrap, message send, actions, citations) |
src/contexts/AuthContext.jsx |
Firebase auth state/provider |
src/hooks/useBlogPosts.js |
Realtime data hooks for posts, projects, credentials |
src/utils/blogUtils.js |
Blog normalization/filtering/date helpers |
src/utils/scrollToSection.js |
Shared smooth-scroll helper |
src/firebase.js |
Firebase client initialization |
server.js |
API server, upload endpoint, chatbot orchestration, static host |
chatbot/prompts/ |
Externalized chatbot prompt layers |
chatbot/knowledge/ |
Grounding data used for retrieval |
chatbot/api/contract.md |
Chatbot endpoint/request-response contract |
chatbot/ui/ |
UI state vocabulary and structured message guidance |
chatbot/schemas/ |
Response/citation/session schema drafts |
.github/workflows/ci.yml |
Lint + smoke test + build checks |
.github/workflows/deploy-vercel.yml |
Vercel preview/production deployments |
Implemented:
POST /api/chatbot/sessionPOST /api/chatbot/messagePOST /api/chatbot/summarizeGET /api/chatbot/config/status
Behavior:
- Server-side Gemini call and fallback behavior
- Prompt layering from
chatbot/prompts/*.md - Retrieval grounding from
chatbot/knowledge/portfolio-profile.json - In-memory session context (
recentTurns, rolling summary, pinned facts) - Structured UI responses (
summary,sections,citations,suggestedActions,meta)
Required (core app):
VITE_FIREBASE_API_KEYVITE_FIREBASE_AUTH_DOMAINVITE_FIREBASE_DATABASE_URLVITE_FIREBASE_PROJECT_IDVITE_FIREBASE_STORAGE_BUCKETVITE_FIREBASE_MESSAGING_SENDER_IDVITE_FIREBASE_APP_ID
Required (chatbot generation):
GEMINI_API_KEY
Required (uploads):
BLOB_READ_WRITE_TOKEN
Optional (admin/server features):
FIREBASE_SERVICE_ACCOUNTADMIN_SECRETS_KEYADMIN_UIDS
npm run dev: run frontend + backend concurrentlynpm run dev:client: run Vite onlynpm run dev:server: run Express onlynpm run lint: TypeScript no-emit checksnpm test: runtime smoke test scriptnpm run build: production build todist/npm start: run Express server
- CI:
.github/workflows/ci.yml - Deploy:
.github/workflows/deploy-vercel.yml
Expected deploy secrets:
VERCEL_TOKENVERCEL_ORG_IDVERCEL_PROJECT_ID
- The chatbot session memory is runtime in-memory and resets on server restart.
docs/and zip-derived standalone admin-console artifacts were removed during cleanup.