A full-stack task tracking application inspired by Linear, featuring a smart voice input system that converts natural speech into structured task fields (title, priority, due date, status).
Users can create, view, update, delete, and organize tasks with both manual forms and voice commands.
https://drive.google.com/drive/folders/13_x0l4mIUkrTjS3rAy6-vnngZtZVL043?usp=sharing
project/
βββ backend/ # Node.js + Express + PostgreSQL backend
βββ frontend/ # React + Vite frontend
βββ README.md # This file
| Layer | Technology |
|---|---|
| Frontend | React, Vite, JavaScript |
| Backend | Node.js, Express |
| Database | MongoDB (Mongoose) |
| Voice Input | Web Speech API (Browser) |
| NLP Parsing | chrono-node + Custom rule-based parser |
| UI | Custom modern CSS |
- Create tasks manually
- Kanban board view + List view
- Edit & update tasks
- Delete with confirmation
- Drag-and-Drop status update
- Filters (status, priority, due date)
- Search (title / description)
- Speak naturally to create tasks
- Auto-extraction of:
- Title
- Priority (high / low / medium / critical)
- Due date (e.g., βtomorrowβ, βnext Mondayβ)
- Status (default: To Do)
- Preview parsed values before saving
- Ability to edit parsed values for accuracy
-
Install & configure Backend
cd backend npm installCreate
backend/.env:MONGODB_URI="" PORT=4000 OPENROUTER_API_KEY="" OPENROUTER_API_URL="https://openrouter.ai/api/v1/chat/completions"
-
Install & configure Frontend
cd ../frontend npm install
-
Current status: This assignment does not include email sending or receiving functionality.
-
All tasks are created and updated directly through the web application using manual forms and voice input.
-
For future enhancement, the backend could be integrated with a transactional email provider (e.g., SendGrid, SES, Resend) to:
-
Deliver email notifications whenever a task is created or modified.
-
Potentially convert incoming emails into tasks β however, this capability is not within the scope of the current assignment.
-
Start Backend (from
backend/directory)npm run dev
Backend runs on
http://localhost:4000 -
Start Frontend (from
frontend/directory)npm run dev
Frontend runs on
http://localhost:5173 -
Open Browser Navigate to
http://localhost:5173
http://localhost:4000/api
GET /api/tasks
- Get all tasks with optional filters
- Query params:
status,priority,dueDate,search - Success:
200 OKwith array of tasks - Errors:
400 Bad Requestfor invalid query parameters500 Internal Server Errorfor unexpected failures
GET /api/tasks/:id
- Get single task by ID
- Success:
200 OKwith task object - Errors:
404 Not Foundwhen the task does not exist
POST /api/tasks
- Create a new task
- Body:
{ title, description?, status?, priority?, dueDate? } - Success:
201 Createdwith task object - Errors:
400 Bad Requestwhentitleis missing or invalid
PUT /api/tasks/:id
- Update a task
- Body:
{ title?, description?, status?, priority?, dueDate? } - Success:
200 OKwith updated task object - Errors:
400 Bad Requestfor invalid fields404 Not Foundwhen the task does not exist
DELETE /api/tasks/:id
- Delete a task
- Success:
204 No Content - Errors:
404 Not Foundwhen the task does not exist
POST /api/speech-to-text
- Convert audio to text using Deepgram
- Body: Raw audio file (WebM format)
- Success:
200 OKwith{ transcript: string } - Errors:
400 Bad Requestwhen no audio is received502 Bad Gatewaywhen Deepgram fails or returns no transcript
POST /api/parse
- Parse natural language transcript into structured task data
- Body:
{ transcript: string } - Success:
200 OKwith{ transcript, parsed: { title, description, priority, status, dueDate } } - Errors:
400 Bad Requestwhen transcript is missing500 Internal Server Errorfor unexpected parsing failures502 Bad Gatewaywhen the parser returns an invalid response
- Click "Add Task" button
- Fill in form fields (title, description, status, priority, due date)
- Click "Save"
- Task appears in appropriate column/list
- Click microphone icon
- Speak: "Create a high priority task to review the pull request by tomorrow evening"
- Click "Stop Recording"
- Review parsed fields in modal (transcript, title, priority, due date)
- Edit if needed, then click "Create Task"
- Task appears on board
- Click on existing task
- Edit fields in modal
- Click "Save"
- Task updates in real-time
- Drag task card from one column to another
- Task status updates automatically
- Changes persist to database
-
Database Selection β MongoDB + Mongoose
- Chose MongoDB for flexible schema and rapid development.
- Task document includes:
title,description,status,priority,dueDate, timestamps.
-
Voice Input Flow β Browser-Native + NLP
- Speech-to-Text using Google Web Speech API (Browser) to avoid paid APIs and reduce latency.
- No dependence on Deepgram / OpenRouter for runtime voice processing.
- Smart NLP implemented using:
chrono-nodefor natural date parsing- keyword rules for priority & status
- string cleanup to auto-extract task title
-
Parsing Strategy
- Parsed fields are always shown to the user before saving.
- Description retains full transcript to preserve context.
- Defaults selected to avoid blocking the flow:
- Status β
TO_DO - Priority β
MEDIUM
- Status β
-
Frontend Architecture
- Single Page Application using React + Vite.
- No Redux required because the app fits local state models cleanly.
- UI focus on productivity:
- Modal form UX
- Board + List view toggling
- Drag-and-drop task updates
-
API Design
- REST-style endpoints using Express.js.
- Logical resource paths
/api/tasksand/api/parse. - Proper HTTP status codes:
201β create success204β delete success404β not found400β validation errors
- Error messages follow consistent JSON format.
-
Drag-and-Drop Persistence
- UI updates immediately on drag.
- Only
statusfield is sent to backend to reduce payload size.
- App is single-user only as per assignment scope (no authentication).
- NLP date understanding is based on server local timezone.
- Priority defaults to MEDIUM when unclear.
- Status defaults to TO_DO when unspecified.
- Browser mic permission is available for speech recording.
- User has internet access for MongoDB Atlas connectivity.
- NLP may misinterpret ambiguous sentences occasionally.
chrono-nodemay not interpret abstract expressions like
βin the evening after lunchβ precisely.- No WebSocket / real-time synchronization.
- No email reminders / notification system.
- No subtasks / labels / multi-project support.