A professional-grade task management system featuring a PriorityQueue-driven backend and a reactive Angular 21 dashboard. Built with a specialized Cyan & Orange theme, supporting real-time synchronization, undo/redo state management, and power-user optimizations.
- β‘ High-Performance UI: Built with Angular 21, Tailwind CSS v4, and Material 3.
- π Unified Dark Mode: Synchronized theme switching across Tailwind and Material UI components.
- π State Management: Full Undo/Redo capabilities via backend stacks.
- π Advanced Reporting: Real-time category-based filtering and PDF Export using
jsPDF. - π Power-User UX:
- Optimistic UI Updates: Instant task addition/removal reflected in the UI before sync.
- Keyboard Shortcuts:
Alt+N(New),Alt+S(Sync),Alt+F(Search). - Visual Feedback: Pulse animations for task execution and red-border overdue highlighting.
- π‘οΈ Robust Backend: Java Spring Boot with Hibernate One-To-Many relationships and transactional integrity.
- Framework: Angular 21+ (Signals, Computed, Standalone Components)
- Styling: Tailwind CSS v4 & Angular Material 3
- HTTP: Modern
provideHttpClient(withFetch()) - PDF Engine:
jsPDF&jspdf-autotable
- Language: Java 17+
- Framework: Spring Boot 3.x
- Database: H2/PostgreSQL with Spring Data JPA
- Logic:
PriorityQueuefor task ordering,Stackfor Undo/Redo.
- Node.js: v20+
- JDK: 17+
- Docker: (Optional, for containerized deployment)
# Navigate to backend
cd task-backend
# Build and run the Spring Boot application
./gradlew bootRunThe API will be available at http://localhost:8081
# Navigate to frontend
cd task-frontend
# Install dependencies
npm install
# Start the dev server
ng serveThe API will be available at http://localhost:4200
All endpoints are prefixed with http://localhost:8081/api/v1/todo/task.
| Method | Endpoint | Parameters (Query) | Description |
|---|---|---|---|
POST |
/add |
priority, description, category, email |
Creates a new task and links it to the user. |
GET |
/next |
Polls and removes the highest priority task from the queue. | |
POST |
/undo |
Reverts the last addition/removal in the current session. | |
POST |
/redo |
Re-applies the last undone action. | |
GET |
/ |
Returns all active tasks sorted by priority (P1 first). |
|
POST |
/save |
email |
Persists the in-memory queue to the database for the user. |
GET |
/load |
email |
Loads the user's persisted tasks from the database into the queue. |
DELETE |
/cleanup |
threshold, email |
Purges all tasks with priority > threshold (e.g., deletes P3, P4). |
GET |
/report |
email |
Returns a JSON Map of tasks grouped by their category. |
GET |
/overdue |
email |
Returns a list of tasks where the dueDate is before today. |
The backend provides real-time health metrics for monitoring and orchestration (e.g., Kubernetes Liveness Probes).
| Endpoint | Description |
|---|---|
/actuator/health |
Returns UP if the Application and Database are healthy. |
/actuator/metrics |
List of JVM metrics (Memory, CPU, Threads). |
/actuator/info |
Custom build information and versioning. |
The dashboard includes a real-time System Health Indicator.
- Pulsing Green: Backend is reachable and Database is connected.
- Pulsing Red: Backend is offline or the Database connection has failed.
- Actuator Endpoint: Accessible at
http://localhost:8081/actuator/health.
In a Production Docker environment, you can point your Nginx or Load Balancer to /actuator/health. If the database fails, the health check will return a 503 Service Unavailable, and the system can automatically restart the container.
- Unique Constraint: The system enforces a unique constraint on the
emailfield in theuser_taskstable. - Transactionality: The
/saveand/addendpoints use@Transactionalto ensure the One-To-Many relationship between Users and Tasks remains consistent. - Date Format: The backend expects
dueDateas a string in the formatMM/dd/yyyywhich is then parsed into aLocalDate.
These shortcuts are globally accessible via the dashboard using the Alt modifier key for maximum productivity.
| Shortcut | Action | Description |
|---|---|---|
Alt + N |
New Task | Opens the Add Task dialog and focuses the description field. |
Alt + S |
Sync to Cloud | Persists current session tasks to the database via the /save endpoint. |
Alt + F |
Focus Search | Instantly highlights the search bar to filter tasks by description. |
Alt + Z |
Undo | Reverts the last addition or removal from the task queue. |
Alt + Y |
Redo | Re-applies the last undone task action. |
Alt + X |
Clear Search | Resets the search filter to show all active tasks. |
You can hover over any primary button in the header to see a Tooltip reminder of its specific keyboard shortcut.
This project is fully containerized with Multi-stage builds.
# Clean existing data and spin up services
docker system prune -a --volumes
docker-compose up --buildThe project uses a custom Cyan-600 primary and Orange-500 secondary palette. Dark mode is toggled via the .dark class on the <html> element, which automatically updates both Tailwind utilities and Material 3 design tokens.
If the backend logs show org.hibernate.NonUniqueResultException: Query did not return a unique result, it means multiple rows exist for a single email in the user_tasks table.
The Fix:
- Clear the Database: Since the schema uses a
UniqueConstraintonemail, any legacy duplicate data must be purged.-- Run in your H2/SQL console DELETE FROM TASK_ENTITY; DELETE FROM USER_TASKS;
- Verify Service Logic: Ensure the saveTask and addTask methods use the .
findByEmail(email).orElse(...)pattern rather than creating a new UserTasks instance every time. - Docker Reset: If running in Docker, a volume prune is the most effective way to reset the persistence layer:
docker system prune -a --volumes
If you see java.time.format.DateTimeParseException, ensure the Angular frontend is sending the date with leading zeros to match the Java LocalDate pattern.
| Error | Cause | Fix |
|---|---|---|
Index 0 Parse Error |
Sending 2/20/2026 |
Use .padStart(2, '0') in Angular to send 02/20/2026. |
Invalid Format |
Sending ISO String | Ensure the TaskService only sends the MM/dd/yyyy portion. |
If Material components (Dialogs, Menus, Selects) stay in Light Mode while the background turns Dark:
- Check Overlay: Ensure the
OverlayContainerintask-manager.component.tsis receiving the.darkclass. - CSS Specificity: Verify that
@custom-variant darkis defined in yourstyles.cssfor Tailwind v4. - Material 3 Tokens: Ensure
@include mat.all-component-colorsis wrapped inside the.darkselector in your SCSS.
To evolve TaskStream Pro into a full-scale enterprise application, the following enhancements are planned:
- JWT Authentication: Integrate Spring Security with JWT (JSON Web Tokens) to replace the current email-only param system.
- Social Login: Add Google/GitHub OAuth2 support via Angular Social Login.
- Role-Based Access (RBAC): Distinct permissions for "Admin" (Global Purge) and "User" (Personal Tasks).
- Push Notifications: Browser-based Service Workers to alert users when a task is Due Today.
- WebSocket Sync: Real-time task updates across multiple browser tabs using STOMP/SockJS.
- Email Reminders: Spring Boot
@Scheduledtasks to send automated "Overdue" digests.
- Performance Analytics: Visualizing task completion velocity and priority distribution via Chart.js and D3.js.
- Category Heatmaps: High-level view of which work categories are most active.
- PWA Support: Transform the Angular dashboard into a Progressive Web App for offline access and home-screen installation.
- Mobile App: Port the existing logic to Ionic or Capacitor for iOS and Android deployment.
Integrating Spring Security is highly recommended as the next step to protect the /api/tasks endpoints from unauthorized access.