An all-in-one veterinarian clinic manager — built as the Final Project for a BSc at Instituto Superior de Engenharia de Lisboa (Summer Semester 2024/2025).
Vetly connects pet owners and clinics through a single platform: pet health records, inventory management, care guides, and emergency clinic lookup via Google Maps.
| Layer | Stack |
|---|---|
| Frontend | Expo (React Native + TypeScript) |
| Backend | Spring MVC (Kotlin) |
| Database | PostgreSQL, Firebase Firestore, Firebase Storage |
| Auth & Messaging | Firebase Authentication |
| Infrastructure | Docker & Docker Compose |
- Docker and Docker Compose
- Node.js (latest LTS)
- Git
- A Firebase project with a service account JSON (Project Settings → Service accounts → Generate new private key)
Optional: Expo Go on a physical device for mobile development. Android Studio and Xcode are only needed for native builds.
git clone https://github.com/cheestree/Vetly
cd vetlyCreate src/.env:
# Spring
SPRING_PROFILES_ACTIVE=dev
JAVA_OPTS=-Xmx512m
CORS_ALLOWED_ORIGINS=http://localhost:8081
BUCKET_NAME=<your-firestore-bucket-name>
# PostgreSQL
POSTGRES_DB=postgres
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_HOST=localhost
# Ports
DB_HOST_PORT=4343
WEB_HOST_PORT=8080
PORT=8080Create src/client/.env:
EXPO_PUBLIC_API_URL=http://<your-lan-ip>:8080/api| File | Location |
|---|---|
Backend service account (serviceAccount.json) |
src/server/src/main/resources/ |
Frontend Firebase config (firebaseConfig.json) |
src/client/ |
Android config (google-services.json) |
src/client/ |
iOS config (GoogleService-Info.plist) (optional) |
src/client/ |
firebaseConfig.json must include a webClientId field. Find it in Google Cloud Console → Credentials → OAuth 2.0 Client IDs (type: Web application).
{
"apiKey": "...",
"authDomain": "...",
"projectId": "...",
"storageBucket": "...",
"messagingSenderId": "...",
"appId": "...",
"measurementId": "...",
"webClientId": "..."
}# Terminal 1 — backend
cd src
docker-compose up
# Terminal 2 — frontend
cd src/client
npm install
npm run start- Web:
http://localhost:8081(or as shown in the Expo terminal) - API:
http://localhost:8080 - Mobile: Scan the QR code in the Expo terminal with Expo Go
Physical device: Set
EXPO_PUBLIC_API_URLto your machine's LAN IP, notlocalhost. If the device is on a different network, use ngrok:ngrok http 8080.
cd src && docker-compose up database webcd src && docker-compose up databaseA default admin account is available at
admin@gmail.com/adminadmin.
Backend changes — restart the service:
cd src && docker-compose restart webFrontend changes — hot reload is automatic. Restart only when changing env vars or native code:
npm run startDatabase schema changes —
cd src
docker-compose down -v
docker-compose up database web