A modern task manager with a clean web UI (Thymeleaf + Bootstrap), JWT authentication (login/signup), role-based access control, analytics dashboard, and optional webhook integration.
- Live Demo
- Key Tech Highlights
- System Architecture
- Features
- Tech Stack
- Screenshots (optional)
- Quick Start (Development)
- Configuration
- Default Admin User
- API
- Project Layout
- Build & Test
- License
- Try it: https://task-maker-fu3y.onrender.com
- Dashboard: https://task-maker-fu3y.onrender.com/dashboard
- Health check: https://task-maker-fu3y.onrender.com/ping
- Stateless auth with JWT (HS256) for easy horizontal scaling via
com.dhruv.taskmanager.security.JwtSecurityand request parsing incom.dhruv.taskmanager.security.JwtAuthFilter. - Flexible, cloud-ready persistence on MongoDB via
com.dhruv.taskmanager.repository.TaskRepository. - Clear domain model and enums:
- Business rules and policy-driven updates via services:
- Commands and events:
com.dhruv.taskmanager.service.TaskCommandService - Repository facade:
com.dhruv.taskmanager.service.TaskService - Analytics:
com.dhruv.taskmanager.service.AnalyticsService
- Commands and events:
- Optional webhooks for integrations, disabled by default, via
com.dhruv.taskmanager.integration.WebhookPublisher. - Modern UI with Thymeleaf + Bootstrap:
- Dashboard HTML: src/main/resources/templates/dashboard.html
- Dashboard JS: src/main/resources/static/dashboard.js
- Auth JS: src/main/resources/static/auth.js
- Styles: src/main/resources/static/main.css
- Frontend (Thymeleaf views)
- Landing: templates/index.html
- Login/Signup: templates/login.html, templates/signup.html
- Dashboard: templates/dashboard.html
- JS/CSS: static/dashboard.js, static/auth.js, static/main.css
- Security
- JWT creation:
security.JwtSecurity - Request filter:
security.JwtAuthFilter
- JWT creation:
- REST layer (not all controllers shown here)
- UI routes:
controller.ViewController - Ping:
controller.PingController
- UI routes:
- Service layer
- Read/write operations and policies:
service.TaskService,service.TaskCommandService - Analytics:
service.AnalyticsService
- Read/write operations and policies:
- Persistence
- Mongo repository:
repository.TaskRepository
- Mongo repository:
- Integrations
- Webhook events:
integration.WebhookPublisher
- Webhook events:
Data flow (high level):
Frontend → JWT-secured REST → Services/Policies → Repository → MongoDB
Events from services → optional Webhook → external system
- Authentication: Sign up / Login with JWT
- Role-based access: User vs Admin
- Task management: create, list, update, delete (policy-based)
- Analytics dashboard:
- Status and priority charts
- Completion trend
- Admin-level analytics (team view)
- Optional webhook publisher for task events (disabled by default)
Backend entry point: com.dhruv.taskmanager.TaskmanagerApplication
Ping endpoint: com.dhruv.taskmanager.controller.PingController
UI routes: com.dhruv.taskmanager.controller.ViewController
| Layer | Tech |
|---|---|
| Runtime | Java 21 |
| Framework | Spring Boot 3 |
| Database | MongoDB |
| Security | Spring Security + JWT |
| UI | Thymeleaf + Bootstrap 5 |
| Charts | Chart.js (dashboard) |
How to add screenshots
- Create folder:
docs/images/ - Save images as:
docs/images/landing.pngdocs/images/dashboard.png
- Uncomment the Markdown section above.
- JDK 21
- MongoDB (local or Atlas connection string)
- Maven wrapper (included):
mvnw/mvnw.cmd
Windows (PowerShell):
$env:MONGODB_URI="mongodb://localhost:27017/taskmanager"
$env:APP_JWT_SECRET="change-me-to-a-long-secret"
$env:APP_JWT_EXP_MIN="120"
# optional:
# $env:APP_WEBHOOK_URL="https://example.com/webhook"
.\mvnw clean spring-boot:runLinux/macOS:
export MONGODB_URI="mongodb://localhost:27017/taskmanager"
export APP_JWT_SECRET="change-me-to-a-long-secret"
export APP_JWT_EXP_MIN=120
# optional:
# export APP_WEBHOOK_URL="https://example.com/webhook"
./mvnw clean spring-boot:runOpen:
- Landing page: http://localhost:8080
- Health check: http://localhost:8080/ping
- Dashboard UI: http://localhost:8080/dashboard
All configuration is in src/main/resources/application.properties.
| Property | Env var | Default | Notes |
|---|---|---|---|
spring.data.mongodb.uri |
MONGODB_URI |
mongodb://localhost:27017/taskmanager |
MongoDB connection |
app.jwt.secret |
APP_JWT_SECRET |
change-me-to-a-long-secret |
Change in production |
app.jwt.exp-min |
APP_JWT_EXP_MIN |
120 |
Token expiration in minutes |
app.webhook.url |
APP_WEBHOOK_URL |
(empty) | Empty disables webhook |
Webhook behavior
app.webhook.urlis intentionally empty by default so the app runs without any external dependency.- When set, the webhook publisher posts task events to your URL.
On first run, an admin user is seeded by com.dhruv.taskmanager.TaskmanagerApplication:
- username:
admin - password:
admin123
Change/remove this seed logic for production deployments.
POST /auth/signup
Body: { "username": "...", "password": "..." }
→ { "token": "<JWT>", "roles": ["USER"], "user": { ... } }
POST /auth/login
Body: { "username": "...", "password": "..." }
→ { "token": "<JWT>", "roles": ["USER"|"ADMIN"], "user": { ... } }GET /api/tasks
GET /api/tasks/{id}
POST /api/tasks
PUT /api/tasks/{id}
DELETE /api/tasks/{id} // admin only by policyExample cURL:
TOKEN=$(curl -s -X POST localhost:8080/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123"}' | jq -r .token)
curl -H "Authorization: Bearer $TOKEN" localhost:8080/api/tasks- Backend source: src/main/java
- Templates (Thymeleaf): src/main/resources/templates
- Static assets: src/main/resources/static
- Config: pom.xml, src/main/resources/application.properties
Key UI files:
- Landing: src/main/resources/templates/index.html
- Login: src/main/resources/templates/login.html
- Signup: src/main/resources/templates/signup.html
- Dashboard: src/main/resources/templates/dashboard.html
- Dashboard JS: src/main/resources/static/dashboard.js
- Global styles: src/main/resources/static/main.css
Analytics DTOs: com.dhruv.taskmanager.dto.AnalyticsDtos
./mvnw -DskipTests compile
./mvnw test
./mvnw packageMIT LICENSE.

