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 StableManager -
Set 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