Organise. Prioritise. Deliver. A sleek, full-stack task management app with real-time status tracking, search, filtering, pagination, and authentication — built with React + Django REST Framework + Neon PostgreSQL.
- ✅ Full CRUD — Create, edit, delete, and view tasks
- 🏷️ Status Tracking — Pending / In Progress / Completed (click to cycle)
- 🔍 Search & Filter — Live search by title/description, filter by status
- 📄 Pagination — 10 tasks per page
- 🔐 Authentication — Register, login, logout + guest mode
- 📱 Responsive UI — Works on mobile and desktop
| Layer | Technology |
|---|---|
| Frontend | React 18, Vite, Axios |
| Backend | Django 4.2, Django REST Framework |
| Database | Neon PostgreSQL (via dj-database-url) |
| Auth | Django Session Authentication |
| Deployment | Render (backend) + Vercel (frontend) |
taskflow/
├── taskmanager_backend/ # Django backend
│ ├── tasks/ # Tasks app (models, views, serializers, urls)
│ ├── taskmanager_backend/ # Settings, root URLs
│ ├── .env.example # Environment variable template
│ ├── requirements.txt
│ └── manage.py
│
└── taskmanager_frontend/ # React + Vite frontend
├── src/
│ ├── App.jsx # Main component
│ ├── App.css # Styles
│ └── api.js # Axios API calls
├── vite.config.js
└── package.json
- Python 3.11+ → https://www.python.org/downloads/release/python-3119/
- Node.js 18+ → https://nodejs.org
- Neon account → https://neon.tech (free tier works)
git clone https://github.com/yourusername/taskflow.git
cd taskflowcd taskmanager_backend
# Create virtual environment
python -m venv venv
# Activate
# Windows:
venv\Scripts\activate
# Mac/Linux:
source venv/bin/activate
# Install dependencies
pip install -r requirements.txt# Copy the example env file
cp .env.example .envEdit .env with your values:
SECRET_KEY=your-long-random-secret-key
DEBUG=True
ALLOWED_HOSTS=localhost,127.0.0.1
DATABASE_URL=postgresql://user:password@ep-xxxx.us-east-2.aws.neon.tech/neondb?sslmode=require
CORS_ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000
SESSION_COOKIE_SECURE=False
CSRF_COOKIE_SECURE=FalseGet your
DATABASE_URLfrom: Neon Dashboard → Your Project → Connection Details → Connection string
python manage.py migrate
python manage.py runserverBackend live at → http://localhost:8000
# In a new terminal
cd taskmanager_frontend
npm install
npm run devFrontend live at → http://localhost:5173
The Vite proxy automatically forwards
/apicalls to Django on port 8000 — no extra config needed.
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/tasks/ |
List tasks (supports ?search= ?status= ?page=) |
POST |
/api/tasks/ |
Create a task |
PATCH |
/api/tasks/{id}/ |
Update a task |
DELETE |
/api/tasks/{id}/ |
Delete a task |
POST |
/api/auth/register/ |
Register new user |
POST |
/api/auth/login/ |
Login |
POST |
/api/auth/logout/ |
Logout |
GET |
/api/auth/me/ |
Current user info |
- Push
taskmanager_backend/to GitHub - Go to render.com → New Web Service
- Connect your GitHub repo
- Set these values:
- Root Directory:
taskmanager_backend - Build Command:
pip install -r requirements.txt - Start Command:
gunicorn taskmanager_backend.wsgi
- Root Directory:
- Add environment variables in Render dashboard:
SECRET_KEY=your-long-random-secret-key
DEBUG=False
ALLOWED_HOSTS=your-app.onrender.com
DATABASE_URL=postgresql://user:password@ep-xxxx.neon.tech/neondb?sslmode=require
CORS_ALLOWED_ORIGINS=https://your-frontend.vercel.app
SESSION_COOKIE_SECURE=True
CSRF_COOKIE_SECURE=True- Click Deploy — Render will install deps and start the server
- Run migrations via Render Shell tab:
python manage.py migrate- Push
taskmanager_frontend/to GitHub - Go to vercel.com → New Project
- Import your repo
- Set Root Directory to
taskmanager_frontend - Add environment variable:
VITE_API_URL=https://your-backend.onrender.com/api- Click Deploy ✅
Go back to Render → Environment Variables → update:
CORS_ALLOWED_ORIGINS=https://your-actual-frontend.vercel.appclass Task(models.Model):
title = CharField(max_length=255) # required
description = TextField(blank=True)
status = CharField(choices=['pending', 'in_progress', 'completed'])
created_at = DateTimeField(auto_now_add=True)
updated_at = DateTimeField(auto_now=True)
user = ForeignKey(User, nullable=True)Built with ❤️ by Sarthak