The JRE version is lower than the compiled bytecode version.
java.lang.UnsupportedClassVersionError: ... has been compiled by a more recent version of the Java Runtime
Fix: Ensure the JRE matches the compiled version. The project requires Java 25.
java -version # must be 25.xCould not resolve placeholder 'APPLICATION_VARIABLE' in value '${APPLICATION_VARIABLE}'
A required environment variable is missing.
Fix: Check your .env file. Compare it against .env.dist — a variable may have been added since you copied it.
diff .env .env.distFlywayException: Found non-empty schema(s) ... without schema history table!
Fix: The database has data but no Flyway history. Run with baseline-on-migrate=true (already set in application.yml) or clean the database.
Caused by: org.flywaydb.core.api.exception.FlywayValidateException
The database has a migration that doesn't match the scripts. This usually means someone manually altered the schema.
Fix for dev: docker compose down -v && docker compose up -d (destroys and recreates the database).
Connection to localhost:5433 refused.
PostgreSQL is not running or not ready yet.
docker compose ps postgres # check status
docker compose logs postgres # check for errors
docker compose up -d postgres # start if stoppedWait for the healthcheck to pass (up to 30s on first start).
DB_USER or DB_PASSWORD mismatch between the app and PostgreSQL.
# Verify what credentials PostgreSQL was created with:
docker compose exec postgres psql -U postgres -c "\du"- Check
STORAGE_PUBLIC_ENDPOINT— this must be reachable from the browser, not just from the server. - Check signed URL expiry: if
STORAGE_SIGNED_URL_EXPIRYis very low (< 60s), URLs may expire before the browser loads them. - Check MinIO is running:
docker compose ps minio
Check the application logs for exceptions:
docker compose logs app-open-schedule | grep -i "Failed to upload\|storage"Common causes:
STORAGE_ACCESS_KEY/STORAGE_SECRET_KEYincorrect- Bucket does not exist and auto-creation failed (permissions issue)
- MinIO is not ready
- Confirm
EMAIL_SMTP_ENABLED=truein your.env - Check application logs:
grep -i emailin the logs - If using Mailpit locally: ensure Mailpit container is running and check
http://localhost:8026 - If using Postal: verify
POSTAL_ENABLED=trueand the API key is valid
Wrong EMAIL_SMTP_USERNAME or EMAIL_SMTP_PASSWORD.
- SendGrid: username must be
apikey(literal string), password is the API key - Mailjet: username is the API key, password is the secret key
The server cannot reach EMAIL_SMTP_HOST on EMAIL_SMTP_PORT. Check firewall rules and that the host/port are correct.
Your sending domain needs proper DNS records:
- SPF — authorizes your mail server
- DKIM — cryptographic signature
- DMARC — policy enforcement
All three must be set up with your DNS provider. SendGrid and Mailjet provide setup instructions in their dashboards.
The Vaadin frontend bundle is not built for production. Run with the production profile:
./mvnw clean package -PproductionIn development, run with the dev profile and let Vaadin compile the frontend on first start.
Ensure the dev profile is active:
./mvnw spring-boot:run -PdevOr in IntelliJ: add -Dspring.profiles.active=dev to the run configuration VM options.
Vaadin requires pnpm for frontend builds. It is auto-installed by the Vaadin Maven plugin on first run. If it fails:
npm install -g pnpmAnother process is using port 51675, 5433, 8026, 9000, or 9001.
# Find what's using port 51675
lsof -i :51675Either stop the conflicting process or change the port in .env / docker-compose.yml.
docker compose logs <service-name>Read the last few lines for the root cause.
If your issue is not covered here:
- Search GitHub Issues — it may already be reported
- Open a GitHub Discussion with full logs
- File a bug report with reproduction steps