Full-stack task manager with a Spring Boot API (JWT auth + Flyway/Postgres) and a React + Vite frontend.
- JWT authentication (login/register) with a stateless Spring Security filter chain
- Full-stack workflow: teams + tasks CRUD, assignment, and status changes
- Database migrations via Flyway and a real Postgres database
- One-command local dev stack via Docker Compose (frontend + backend + db)
- End-to-end smoke tests with Playwright
- Docker Engine / Docker Desktop
- Docker Compose v2 (
docker compose)
cp .env.example .env
docker compose up -d --build
# follow logs (Ctrl+C to stop following)
docker compose logs -fNotes:
- If you prefer running in the foreground, omit
-d. - If you change code and want to rebuild images, re-run with
--build. - First run can take a bit (backend runs via Maven and downloads dependencies into the Compose volume cache).
- Compose defaults to
SPRING_PROFILES_ACTIVE=dev.
docker compose downdocker compose down -vEnvironment variables (optional) are documented in .env.example. Common ones:
POSTGRES_DB,POSTGRES_USER,POSTGRES_PASSWORD,POSTGRES_PORTSPRING_PROFILES_ACTIVEJWT_SECRET,JWT_EXPIRATION,CORS_ALLOWED_ORIGINSVITE_PROXY_TARGET
- Frontend: http://localhost:5173
- Backend API: http://localhost:8080
- Swagger UI: http://localhost:8080/swagger-ui/index.html
- OpenAPI JSON: http://localhost:8080/v3/api-docs
- Start the stack using the Quickstart above.
- Open the app at http://localhost:5173.
- Login:
- When running with the
devprofile (Compose default), the backend seeds demo users in backend/src/main/java/com/taskmanager/api/config/DevDataSeeder.java. - Demo users (password is
password):alice,bob,charlie,dana. - If you’re not running the
devprofile, create an account via the UI at/register.
- When running with the
- Click Teams → New Team → create a team.
- From the new team card, click View Tasks, then create a task and change its status.
- Optional: open Swagger UI and try the auth endpoints and task endpoints.
cd backend
./mvnw -B testNote: some Testcontainers-based integration tests are currently annotated with @Disabled(...) due to CI timing flakiness:
- backend/src/test/java/com/taskmanager/api/AuthIntegrationTest.java
- backend/src/test/java/com/taskmanager/api/TeamTaskIntegrationTest.java
- backend/src/test/java/com/taskmanager/api/TaskManagerApiApplicationTests.java
Prereqs:
- Backend reachable at http://localhost:8080 (Quickstart Compose is the easiest way)
cd frontend
npm ci
npm run e2e:install
npm run e2eThe smoke tests live in frontend/e2e/smoke.spec.js and cover:
- Login
- Create team → view tasks → create task → change status
Optional env vars:
E2E_USERNAME/E2E_PASSWORD(defaults toalice/password)PLAYWRIGHT_BASE_URL(defaults to http://localhost:5173)
- backend/ — Spring Boot API
- frontend/ — React + Vite UI
- docker-compose.yml — local dev stack (db + backend + frontend)
- frontend/e2e/ — Playwright tests
- backend/src/main/resources/db/migration/active/ — Flyway migrations
- Port conflicts:
- Frontend uses
5173 - Backend uses
8080 - Postgres maps to host port
5433by default (overridePOSTGRES_PORTin.env)
- Frontend uses
- Rebuild containers after dependency changes:
docker compose down
docker compose up --build- Reset the DB volume (re-runs migrations + dev seed on next start):
docker compose down -v
docker compose up- Running the frontend outside Docker:
- Vite proxies
/apitoVITE_PROXY_TARGET(defaults tohttp://localhost:8080).
- Vite proxies