Fullstack demo project built with a modern Java / Angular stack.
- Backend: Spring Boot 3 (Java 21), PostgreSQL, Flyway, Spring Security, JWT
- Frontend: Angular 20 + Angular Material (standalone components only)
- API documentation: OpenAPI / Swagger
- API tests: Bruno (manual + E2E in CI)
- Frontend: https://projects.manooweb.fr
- API: https://projects-api.manooweb.fr
- Swagger UI: https://projects-api.manooweb.fr/swagger-ui/index.html
- Healthcheck: https://projects-api.manooweb.fr/api/v1/health
- Demo account:
demo / demo
The currently deployed public MVP corresponds to the following GitHub release:
- v0.18.0 — Public MVP deployed (Vercel + Railway)
See full release notes: https://github.com/manooweb/springboot-rest-api-demo/releases/tag/v0.18.0
- Swagger UI is publicly accessible (intentional, demo purpose).
- Demo account (
demo / demo) shared by all users. - No rate limiting or advanced security hardening yet.
- Project board: https://github.com/users/manooweb/projects/4/views/1
- Frontend: Vercel
- Backend: Railway (Spring Boot + PostgreSQL)
- Database migrations: Flyway
backend/: Spring Boot REST API (Projects, Tasks, JWT authentication)frontend/: Angular UI (login, projects, project details, tasks)bruno/: API test collections (manual + e2e)docker-compose.yml: PostgreSQL for local development
- Java 21
- Node.js + npm
- Docker + Docker Compose
docker compose up -dcd backend
./mvnw spring-boot:run -Dspring-boot.run.profiles=dockercd frontend
npm install
npm run startThe frontend uses an Angular proxy configuration for API calls, therefore it must be started via the
startnpm script.
docker compose downdocker compose down -v- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI JSON: http://localhost:8080/v3/api-docs
POST /api/v1/auth/login→ returns a JWT token- All
/api/v1/**endpoints are protected (except login & swagger) - Required header:
Authorization: Bearer <token>
- Login page
- JWT token stored client-side
- HTTP interceptor automatically adds
Authorization: Bearer <token> - Route guard protects authenticated routes
- Logout clears the token
- List projects
- Create project via Angular Material dialog
- Project detail page:
/projects/:id
- List project tasks
- Create task via dialog:
- title (required)
- description (optional)
- dueDate (datepicker, default = today)
- status (TODO / IN_PROGRESS / DONE)
- Change status with a single click:
- rotation TODO → IN_PROGRESS → DONE → TODO
- backend PATCH call
- User feedback via snackbars (success / error)
- Manual requests:
bruno/backend/Projectsbruno/backend/Tasks
- Full E2E scenario:
bruno/backend/e2e
Run E2E tests locally:
npm install
npm run test:apiAPI tests are also executed in CI using GitHub Actions.
Backend tests can be executed with:
cd backend
./mvnw testTest coverage is intentionally minimal at this stage and will be extended incrementally.
Frontend unit tests can be executed with:
cd frontend
npm install
npm test -- --watch=falseRun tests with a headless browser (useful for CI):
cd frontend
npm test -- --watch=false --browsers=ChromeHeadlessFrontend tests are also executed in CI using GitHub Actions.
- Angular standalone components only
- Simple template-driven forms on purpose
- Backend as the single source of truth
- No premature abstraction
- Focus on clarity and maintainability
- UI/UX improvements (layout, spacing, responsive)
- Accessibility
- Internationalization (i18n)
- Deployment