Skip to content

Latest commit

 

History

History
136 lines (102 loc) · 3.75 KB

File metadata and controls

136 lines (102 loc) · 3.75 KB

Stable Manager

A comprehensive equine care management platform for stables. Track horses, health events, vaccinations, worm tests, treatments, and receive automated notifications.

Features

  • 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

Tech Stack

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

Getting Started

Prerequisites

  • Java 21+
  • PostgreSQL 15+
  • Node.js 18+ (for frontend build)
  • Gradle 8.x

Local Development

  1. Clone the repository

    git clone https://github.com/TorbenMerrald/StableManager.git
    cd StableManager
  2. Set up the database

    createdb stablemanager
  3. Configure local settings

    Copy the example configuration:

    cp src/main/resources/application-dev.properties.example \
       src/main/resources/application-dev.properties

    Edit application-dev.properties with your local settings (database, S3, etc.)

  4. Run the application

    ./gradlew bootRun

    The application will be available at http://localhost:7070

  5. Default login

    • Username: admin
    • Password: admin

Running Tests

./gradlew test                              # Run all tests
./gradlew test --tests "ClassName"          # Run single test class
./gradlew test --tests "*.methodName"       # Run single test method

Configuration

Environment Variables (Production)

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)

Deployment

Building the Docker Image

./gradlew bootBuildImage --imageName=torbenmerrald/stablemanager:<version>
docker push torbenmerrald/stablemanager:<version>

Deploying with Kamal

kamal deploy --skip-push --version=<version>

See config/deploy.yml for Kamal configuration.

Project Structure

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

License

Proprietary - All rights reserved.

Author

Torben Merrald - merrald.dk