Vet Clinic Management System is a passion-driven side project built from over 18 years of professional software development experience. What started as a personal challenge is evolving into a robust, comprehensive management platform for veterinary clinics. Developing this as a side project allows me to prioritize quality and user experience. My goal is to create a powerful, self-hosted solution that will always be 100% free for anyone to deploy and manage themselves. While I may eventually offer a managed hosting service for those who prefer a turnkey experience, the core software will remain free and open to the community. Note: This project is currently a work in progress. It will take time to reach the full level of maturity I envision, but development is steady and ongoing.
This is a web-based application to manage a mobile veterinary clinic, built with Angular, NestJS, and Prisma.
- Docker: Install Docker Desktop (includes Docker Compose)
That's it! Docker handles everything else — Node.js, PostgreSQL, dependencies, builds.
- Node.js: v24 or later
- PostgreSQL: v16 or later (running locally or remotely)
- NX: This project uses Nx for monorepo management
The entire application is self-contained in Docker. One command to start everything:
# Build and start the full stack (PostgreSQL + App)
docker compose up -d --build
# First run — seed the database with sample data
SEED_DB=true docker compose up -d --build
# On Windows PowerShell:
$env:SEED_DB="true"; docker compose up -d --buildOnce started:
- Application: http://localhost:3000
- API Docs (Swagger): http://localhost:3000/api-docs
# Start the stack
docker compose up -d
# Stop the stack (data is preserved)
docker compose down
# Stop and wipe all data
docker compose down -v
# View logs
docker compose logs -f app
# Rebuild after code changes
docker compose up -d --buildnpm installThe project uses PostgreSQL. Ensure you have a PostgreSQL instance running.
# Copy the example environment file and configure your database connection
cp .env.example .env
# Edit .env with your PostgreSQL connection string
# Generate Prisma Client
npm run db:generate
# Run migrations
npm run db:migrate
# (Optional) Seed the database with sample data
npm run db:seedYou can start both the backend and frontend simultaneously, or individually.
npm start# Start the Backend (API) - Default: http://localhost:3000
npm run start:api
# Start the Frontend (Web) - Default: http://localhost:4200
npm run start:web| View | Light Mode | Dark Mode |
|---|---|---|
| Dashboard | ![]() |
![]() |
| Patient Directory | ![]() |
![]() |
| Clinic Settings | ![]() |
![]() |
| Tasks & Reminders | ![]() |
![]() |
| Messages | ![]() |
![]() |
| Invoices | ![]() |
![]() |
| Appointments | ![]() |
![]() |
| Clients / Clients | ![]() |
![]() |
| User Settings | ![]() |
![]() |
The patient details view features a route-based tab navigation system for comprehensive records.
| Tab | Light Mode | Dark Mode |
|---|---|---|
| Medical History | ![]() |
![]() |
| Vaccinations | ![]() |
![]() |
| Prescriptions | ![]() |
![]() |
| Appointments | ![]() |
![]() |
| Boarding | ![]() |
![]() |
| Tasks | ![]() |
![]() |
| Estimates | ![]() |
![]() |
| Forms | ![]() |
![]() |
| Invoices | ![]() |
![]() |
| Labs | ![]() |
![]() |
| Reminders | ![]() |
![]() |
Standardized modals for adding records across all patient sub-sections.
| Section | Light Mode | Dark Mode |
|---|---|---|
| Medical History | ![]() |
![]() |
| Vaccinations | ![]() |
![]() |
| Prescriptions | ![]() |
![]() |
| Appointments | ![]() |
![]() |
| Boarding | ![]() |
![]() |
| Tasks | ![]() |
![]() |
| Estimates | ![]() |
![]() |
| Forms | ![]() |
![]() |
| Invoices | ![]() |
![]() |
| Labs | ![]() |
![]() |
| Reminders | ![]() |
![]() |
Standardized modals for generating reports and printing.
| Section | Light Mode | Dark Mode |
|---|---|---|
| Medical History | ![]() |
![]() |
| Vaccinations | ![]() |
![]() |
| Prescriptions | ![]() |
![]() |
| Appointments | ![]() |
![]() |
| Boarding | ![]() |
![]() |
| Tasks | ![]() |
![]() |
| Estimates | ![]() |
![]() |
| Forms | ![]() |
![]() |
| Invoices | ![]() |
![]() |
| Labs | ![]() |
![]() |
| Reminders | ![]() |
![]() |
The client details view provides a comprehensive overview of client records with tabbed navigation.
| Tab | Light Mode | Dark Mode |
|---|---|---|
| Client Info | ![]() |
![]() |
| Patients | ![]() |
![]() |
| Financial | ![]() |
![]() |
| Appointments | ![]() |
![]() |
| Boarding | ![]() |
![]() |
| Tasks | ![]() |
![]() |
| Reminders | ![]() |
![]() |
| Forms | ![]() |
![]() |
| Messaging | ![]() |
![]() |
| Section | Light Mode | Dark Mode |
|---|---|---|
| Patients | ![]() |
![]() |
| Financial | ![]() |
![]() |
| Appointments | ![]() |
![]() |
| Boarding | ![]() |
![]() |
| Tasks | ![]() |
![]() |
| Reminders | ![]() |
![]() |
| Forms | ![]() |
![]() |
| Messaging | ![]() |
![]() |
- Swagger UI (API Docs): http://localhost:3000/api-docs
- Prisma Studio (DB Manager): http://localhost:5555 (Run
npm run db:studio)
The screenshots in this README.md and the docs/screenshots directory are automatically generated to ensure consistency across Light and Dark modes.
To refresh all screenshots:
- Ensure the application is running (
npm start). - Run the generation script:
node docs/maintenance/generate_screenshots.js
This script uses Playwright to:
- Navigate to all key application routes.
- Capture screenshots in both Light and Dark modes.
- Save the results directly to
docs/screenshots/.
vet-clinic: Angular Frontend with Material Design.api: NestJS Backend.shared-types: Shared TypeScript interfaces and DTOs.prisma: Database schema and migrations.docker: Docker entrypoint and related scripts.
- Frontend: Angular + Angular Material. Responsive design for mobile, tablet, and desktop.
- Backend: NestJS for a structured, scalable API.
- Database: Prisma ORM with PostgreSQL.
- Deployment: Fully containerized with Docker Compose (PostgreSQL + App in a single
docker compose up).





















































































































