FlowForge is a compact workflow platform with a Spring Boot REST API, a responsive browser client and PostgreSQL persistence. It demonstrates a complete request path from accessible UI to validation, business logic, transactions and database storage.
- Create, view, filter, update and delete work items
- Track owner, priority and workflow status
- Validate requests and return consistent API errors
- Persist production data in PostgreSQL through Spring Data JPA
- Explore the API through generated OpenAPI / Swagger documentation
- Monitor application health through Spring Boot Actuator
- Run an isolated demo with H2 and realistic seed data
- Verify the application with MockMvc integration tests and Maven CI
The demo profile needs no database setup. It starts with four sample work items and stores changes in an in-memory H2 database that resets when the app stops.
With Maven and Java 21:
mvn spring-boot:run -Dspring-boot.run.profiles=demoOr with Docker:
docker compose -f compose.demo.yml up --buildOpen http://localhost:8080. The API documentation is available at http://localhost:8080/swagger-ui.html.
Start the application together with PostgreSQL:
docker compose up --buildThe compose configuration waits for PostgreSQL to become healthy before starting FlowForge.
| Method | Endpoint | Purpose |
|---|---|---|
POST |
/api/work-items |
Create a work item |
GET |
/api/work-items |
List all work items |
GET |
/api/work-items?status=DONE |
Filter by status |
GET |
/api/work-items/{id} |
Get one work item |
PUT |
/api/work-items/{id} |
Replace a work item |
DELETE |
/api/work-items/{id} |
Delete a work item |
flowchart TD
UI["Browser client"] --> API["Spring Boot REST API"]
API --> SVC["Service layer"]
SVC --> JPA["Spring Data JPA"]
JPA --> DB["PostgreSQL / H2 demo"]
The backend uses controller, service, repository and domain layers. The browser client is served by Spring Boot, so UI and API share the same origin.
- Java 21 and Spring Boot 3.5
- Spring Web, Spring Data JPA, Bean Validation and Actuator
- PostgreSQL for the standard runtime; H2 for tests and demo mode
- OpenAPI / Swagger UI with springdoc-openapi
- HTML, CSS and vanilla JavaScript
- Maven, Docker and Docker Compose
- JUnit 5 and MockMvc
- GitHub Actions
The default profile reads these environment variables:
| Variable | Default | Description |
|---|---|---|
JDBC_DATABASE_URL |
jdbc:postgresql://localhost:5432/flowforge |
JDBC connection URL |
DB_USER |
flowforge |
Database user |
DB_PASSWORD |
flowforge |
Database password |
PORT |
8080 |
HTTP port |
mvn --batch-mode --no-transfer-progress clean verifyThe GitHub Actions workflow runs the same Maven lifecycle on every push and
pull request to main, caches dependencies, and uploads both test reports and
the executable JAR.
.
├── .github/workflows/maven.yml
├── android-client/
├── docs/
├── src/main/java/
├── src/main/resources/static/
├── src/test/
├── compose.demo.yml
├── docker-compose.yml
├── Dockerfile
└── pom.xml
Released under the MIT License.
Built by Erica Nordlöf.
