A responsive full-stack task manager built with Python Flask, Flask-SQLAlchemy, SQLite, HTML, CSS, and vanilla JavaScript.
- Account registration, sign-in, password hashing, and sign-out
- User-owned tasks (each account only sees its own tasks)
- Create, read, update, and delete tasks (CRUD)
- Task status: To do, In progress, Completed
- Priority: Low, Medium, High
- Optional due dates with overdue indicators
- Dashboard statistics and progress bars
- Search, status filters, date views, and sorting
- Responsive desktop, tablet, and mobile layout
- Lightweight 10-second polling for updates across open sessions (no WebSocket service required)
- JSON API endpoints for task operations
- Backend: Python + Flask
- Database/ORM: SQLite + Flask-SQLAlchemy
- Authentication: Flask session + Werkzeug password hashing
- Frontend: HTML templates, custom CSS, vanilla JavaScript Fetch API
cd taskflow_task_managerWindows PowerShell:
py -m venv .venv
.venv\\Scripts\\Activate.ps1macOS/Linux:
python3 -m venv .venv
source .venv/bin/activatepip install -r requirements.txtCopy .env.example to .env, then set a unique SECRET_KEY. Flask does not automatically load .env in this project, so either export the variables in your terminal or install python-dotenv and run through Flask. For a simple local run, the development fallback secret is enabled; replace it before deployment.
PowerShell:
$env:SECRET_KEY="your-long-random-secret"macOS/Linux:
export SECRET_KEY="your-long-random-secret"python app.pyThe SQLite database taskflow.db is created automatically on first run.
All task API routes require a signed-in session.
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /api/tasks |
List current user's tasks |
| POST | /api/tasks |
Create task |
| PATCH | /api/tasks/<id> |
Update task fields |
| DELETE | /api/tasks/<id> |
Delete task |
| GET | /api/health |
Health check |
Example create-task JSON:
{
"title": "Prepare project presentation",
"description": "Finalize slides and rehearse",
"status": "todo",
"priority": "high",
"due_date": "2026-10-09"
}- Set
SECRET_KEYto a long, random value in your hosting provider's environment variables. - Set
FLASK_DEBUG=falsein production. - Use a persistent disk for SQLite on hosts where local files are ephemeral, or configure
DATABASE_URLfor a managed PostgreSQL database. - Run behind a production WSGI server such as Gunicorn (
pip install gunicorn, thengunicorn app:app). - For production hardening, add CSRF protection for form/session endpoints, HTTPS-only secure cookie settings, database migrations, and rate limiting.
taskflow_task_manager/
├── app.py
├── requirements.txt
├── .env.example
├── README.md
├── templates/
│ ├── base.html
│ ├── landing.html
│ ├── auth.html
│ └── dashboard.html
└── static/
├── css/style.css
└── js/
├── app.js
└── dashboard.js