Senior Project — Developed as part of the two-semester Senior Project course. Ranked 3rd in the department graduation project competition.
Project Advisor:
Prof. Dr. Oumout Chouseinoglou
Web platform for Petlyst — a system connecting pet owners, veterinarians, and clinics. Includes appointment booking, clinic management, hospitalization tracking, inventory, medical examinations, and reviews.
- Frontend: React 18 + TypeScript + Vite, Redux Toolkit, Tailwind CSS, Axios
- Backend: Node.js + Express, PostgreSQL (
pg), JWT auth, AWS S3 (image storage), Nodemailer (SMTP) - Other: AES-256-CBC encryption for sensitive fields (e.g. TC identity numbers), Expo push notifications
backend/petlyst-webapp-backend/ Express API server
frontend/petlyst-webapp-frontend/ React + Vite client
- Node.js 18+
- PostgreSQL 14+
- An AWS S3 bucket (for image uploads)
- A Google Maps Platform API key
- (Optional) An SMTP account for password-reset / verification emails
git clone https://github.com/<your-account>/Petlyst-Web.git
cd Petlyst-Webcd backend/petlyst-webapp-backend
cp .env.example .env
# Fill in real values in .env (DB credentials, JWT_SECRET, ENCRYPTION_KEY, AWS, SMTP, etc.)
npm install
npm startThe API listens on http://localhost:3000 by default.
ENCRYPTION_KEY is required and must be exactly 32 characters (AES-256). The server will refuse to start without it.
cd frontend/petlyst-webapp-frontend
cp .env.example .env
# Fill in VITE_API_URL and VITE_GOOGLE_MAPS_API_KEY
npm install
npm run devThe dev server runs on http://localhost:5173 and proxies /api to the backend.
Schema bootstrapping is handled by the running backend (it auto-creates / migrates several columns on startup). For new installs you will need to create the database manually and run any migrations under backend/petlyst-webapp-backend/scripts/.
See backend/petlyst-webapp-backend/.env.example and frontend/petlyst-webapp-frontend/.env.example for the full list.
Real .env files are git-ignored. Never commit credentials.
Sensitive identifiers (e.g. veterinarian TC numbers) are encrypted at rest with AES-256-CBC using ENCRYPTION_KEY from the environment. See backend/petlyst-webapp-backend/utils/encryption.js.
If you rotate ENCRYPTION_KEY, existing ciphertexts will become unreadable — re-encrypt them with the new key before swapping.
Planned post-launch improvements (CI, component decomposition, API client consolidation, logging discipline, smoke tests) are tracked in ROADMAP.md.
MIT — see LICENSE.
