A comprehensive equine care management platform for stables. Track horses, health events, vaccinations, worm tests, treatments, and receive automated notifications.
- Horse Management - Complete profiles with health history, documents, and care schedules
- Vaccination Tracking - Plan and monitor vaccinations with automated reminders
- Worm Testing - Schedule tests and track results with reminder notifications
- Treatment Schedules - Recurring treatments with automatic task generation
- Health Events - Log vet visits, feeding, therapy, farrier appointments, and more
- Document Storage - Attach files and images to horses (stored in S3)
- Multi-Tenant - Data isolation per stable with role-based access control
- Notifications - Email, SMS (GatewayAPI), and in-app notifications
- Dashboard - Overview of upcoming tasks, due vaccinations, and alerts
- Localization - English and Danish language support
| Component | Technology |
|---|---|
| Backend | Java 21, Spring Boot, Jmix 2.7 |
| Frontend | Vaadin 24.9 Flow UI |
| Database | PostgreSQL with EclipseLink ORM |
| Build | Gradle 8.x |
| Scheduling | Quartz |
| File Storage | AWS S3 / DigitalOcean Spaces |
| Deployment | Docker, Kamal 2 |
- Java 21+
- PostgreSQL 15+
- Node.js 18+ (for frontend build)
- Gradle 8.x
Clone the repository
git clone https://github.com/TorbenMerrald/StableManager.git cd StableManagerSet up the database
createdb stablemanager
Configure local settings
Copy the example configuration:
cp src/main/resources/application-dev.properties.example \ src/main/resources/application-dev.properties
Edit
application-dev.propertieswith your local settings (database, S3, etc.)Run the application
./gradlew bootRun
The application will be available at http://localhost:7070
Default login
- Username:
admin - Password:
admin
- Username:
./gradlew test# Run all tests
./gradlew test --tests "ClassName"# Run single test class
./gradlew test --tests "*.methodName"# Run single test method| Variable | Description |
|---|---|
SQL_URL | PostgreSQL JDBC URL |
SQL_USERNAME | Database username |
SQL_PASSWORD | Database password |
S3_BUCKET | S3 bucket name |
S3_ACCESSKEY | S3 access key |
S3_SECRET_ACCESSKEY | S3 secret key |
S3_ENDPOINT | S3 endpoint URL |
S3_REGION | S3 region |
SMTP_USERNAME | SMTP username |
SMTP_PASSWORD | SMTP password |
SMS_GATEWAYAPI_KEY | GatewayAPI key (optional) |
SMS_GATEWAYAPI_SECRET | GatewayAPI secret (optional) |
OPENAI_API_KEY | OpenAI API key for document summarization (optional) |
./gradlew bootBuildImage --imageName=torbenmerrald/stablemanager:<version>
docker push torbenmerrald/stablemanager:<version>kamal deploy --skip-push --version=<version>See config/deploy.yml for Kamal configuration.
src/main/java/dk/merrald/sm/
├── entity/ # JPA entities (Horse, Event, VaccinePlan, etc.)
├── view/ # Vaadin Flow UI views
├── service/ # Business logic
├── app/ # Scheduled jobs (reminders, task generation)
├── listener/ # Entity event listeners
└── security/ # Roles and authentication
Proprietary - All rights reserved.
Torben Merrald - merrald.dk