A full-stack project management SaaS application built with Java Spring Boot and React. Inspired by Jira β built from scratch to learn industry-grade Java development end to end.
- Java 21 β LTS version used in production by most companies
- Spring Boot 3 β Industry standard Java framework
- Spring Security + JWT β Stateless authentication with access + refresh tokens
- Spring Data JPA + Hibernate β ORM for database operations
- PostgreSQL β Primary relational database
- Flyway β Database schema versioning and migrations
- Redis β Caching layer for performance
- Apache Kafka β Async event-driven notifications
- AWS S3 β File and attachment storage
- React 18 + TypeScript β Type-safe component-based UI
- React Query (TanStack) β Server state management and caching
- Axios β HTTP client
- Tailwind CSS β Utility-first styling
- Zustand β Client-side state management
- React Router β Client-side routing
- Docker + Docker Compose β Containerized local development
- GitHub Actions β CI/CD pipeline
- Prometheus + Grafana β Metrics and monitoring dashboards
- Logback β Structured logging
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β React 18 + TypeScript β
β React Query Β· Zustand Β· Tailwind β
βββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββ
β REST / JSON
βββββββββββββββββββββββΌββββββββββββββββββββββββββββββββ
β Spring Boot 3 β
β β
β βββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β Auth β β Project β β Notification β β
β β Service β β Service β β Service β β
β βββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β
β Spring MVC Β· Spring Data JPA Β· Spring Security β
ββββββββ¬βββββββββββββββ¬βββββββββββ¬βββββββββββββ¬ββββββββ
β β β β
ββββββββΌββββ βββββββββΌβββ ββββββΌβββββ ββββββΌβββββ
βPostgreSQLβ β Redis β β Kafka β β AWS S3 β
β Flyway β β Cache β β Events β β Files β
ββββββββββββ ββββββββββββ βββββββββββ βββββββββββ
src/main/java/com/flowboard/
βββ config/ # Spring configuration (Security, Redis, S3)
βββ controller/ # REST controllers β HTTP layer
βββ service/ # Business logic layer
βββ repository/ # Database access layer
βββ domain/
β βββ entity/ # JPA entities (User, Workspace, Board, Task)
β βββ enums/ # TaskStatus, Priority, Role
βββ dto/
β βββ request/ # Incoming request bodies
β βββ response/ # Outgoing response bodies
βββ exception/ # Custom exceptions + global error handler
βββ security/ # JWT filter + UserDetails implementation
βββ util/ # Helper classes
src/main/resources/
βββ db/migration/ # Flyway SQL migrations (V1__, V2__, ...)
βββ application.yml # Application configuration
- Java 21
- Docker Desktop
- Maven (included via
./mvnwwrapper) - Git
git clone https://github.com/pratik20gb/flowboard.git
cd flowboard# Starts PostgreSQL and Redis in Docker
docker compose up -d./mvnw spring-boot:runThe API will be available at http://localhost:8080
curl http://localhost:8080/api/v1/healthExpected response:
{
"status": "UP",
"service": "FlowBoard API",
"version": "1.0.0",
"timestamp": "2026-06-02T..."
}### Authentication
POST /api/v1/auth/register # Create a new account
POST /api/v1/auth/login # Login and get JWT tokens
POST /api/v1/auth/refresh # Refresh expired access token
### Workspaces
GET /api/v1/workspaces # List all workspaces
POST /api/v1/workspaces # Create a workspace
GET /api/v1/workspaces/{id} # Get workspace by ID
PUT /api/v1/workspaces/{id} # Update workspace
DELETE /api/v1/workspaces/{id} # Delete workspace
### Boards
GET /api/v1/workspaces/{id}/boards # List boards in workspace
POST /api/v1/workspaces/{id}/boards # Create a board
GET /api/v1/boards/{id} # Get board by ID
DELETE /api/v1/boards/{id} # Delete board
### Tasks
GET /api/v1/boards/{id}/tasks # List tasks on a board
POST /api/v1/boards/{id}/tasks # Create a task
GET /api/v1/tasks/{id} # Get task by ID
PUT /api/v1/tasks/{id} # Update task
PATCH /api/v1/tasks/{id}/status # Update task status only
DELETE /api/v1/tasks/{id} # Delete task
### Health & Monitoring
GET /api/v1/health # Application health check
GET /actuator/health # Spring Actuator health
GET /actuator/metrics # Application metrics
---
| Phase | Description | Status |
|---|---|---|
| Phase 1 | Project setup, Docker, Flyway, Health endpoint | β Complete |
| Phase 2 | JWT Authentication β register, login, refresh | π In Progress |
| Phase 3 | Core domain β workspaces, boards, tasks | β³ Pending |
| Phase 4 | Redis caching + AWS S3 file uploads | β³ Pending |
| Phase 5 | Kafka events + email notifications | β³ Pending |
| Phase 6 | Testing β JUnit, Mockito, Testcontainers | β³ Pending |
| Phase 7 | React frontend + CI/CD + Grafana | β³ Pending |
## π Authentication Flow
POST /auth/register
β Password hashed with BCrypt
β User saved to PostgreSQL
β Access token (15 min) + Refresh token (7 days) returned
POST /auth/login
β Email + password verified
β New access + refresh tokens returned
Every protected request
β Authorization: Bearer <access_token> header required
β JWT filter validates signature and expiry
β 401 Unauthorized if missing or invalid
| Service | Image | Port |
|---|---|---|
| PostgreSQL | postgres:16-alpine | 5432 |
| Redis | redis:7-alpine | 6379 |
Managed by Flyway. Migration files live in src/main/resources/db/migration/.
| Version | Description |
|---|---|
| V1 | Create users table |
New migrations are added as V2__description.sql, V3__description.sql etc. Never edit an existing migration file.
- Unit tests β JUnit 5 + Mockito for service layer
- Integration tests β Testcontainers (real PostgreSQL in Docker)
- API tests β MockMvc for controller layer
- Coverage target β 80%+
Once Phase 7 is complete:
- Prometheus scrapes metrics from
/actuator/prometheus - Grafana dashboard visualizes request rates, response times, error rates
- Structured logs via Logback with timestamp, thread, level, and class
This is a personal learning project. Feel free to fork it and build your own version.
Pratik β @pratik20gb
Built as a complete full-stack Java learning project β from zero to production-grade.
MIT License β free to use and learn from.