Skip to content

Rohankumar2201/taskr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

4 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—  β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— 
β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•‘ β–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—
   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β• β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•
   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β•šβ•β•β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•— β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—
   β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘  β–ˆβ–ˆβ•‘
   β•šβ•β•   β•šβ•β•  β•šβ•β•β•šβ•β•β•β•β•β•β•β•šβ•β•  β•šβ•β•β•šβ•β•  β•šβ•β•

A minimal, beautiful, production-grade to-do app. Stay organized. Ship faster. Zero friction.


Live Demo GitHub Stars GitHub Forks License: MIT PRs Welcome


Use Screely for a beautiful browser-frame mockup.


πŸ“‹ Table of Contents


✨ Features

Taskr was built in three deliberate phases β€” from core utility to polished experience.

🟒 Phase 1 β€” Core (The Basics, Done Right)

Feature Details
βž• Add Tasks Type + press Enter or click Add
βœ… Complete Tasks Click the circle β€” smooth toggle animation
πŸ—‘ Delete Tasks Hover a card, hit the trash icon
πŸ’Ύ Persistence LocalStorage β€” survives refresh, tab close, everything

πŸ”΅ Phase 2 β€” Productivity Layer

Feature Details
✏️ Inline Edit Hover any task β†’ pencil β†’ type β†’ Enter to save, Esc to cancel
🏷 4 Categories Work πŸ’Ό Β· Personal 🏠 Β· Study πŸ“š Β· Health πŸ’ͺ
πŸ“… Due Dates Smart labels: Today, Tomorrow, 2d overdue
πŸ” Live Search Debounced real-time filtering as you type
πŸ—‚ Filter Tabs Filter by status (All / Active / Completed) + by category

🟣 Phase 3 β€” Delightful Details

Feature Details
πŸ–± Drag & Drop Reorder tasks by dragging β€” order persists to localStorage
πŸŒ™ Dark Mode Toggle with memory β€” remembers your preference
πŸ“Š Progress Bar Live completion percentage with smooth animation
πŸ”” Toast Alerts Contextual notifications for every action
🧹 Clear Done Bulk-delete all completed tasks in one click

πŸ›  Tech Stack

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Layer         β”‚  Technology                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Markup        β”‚  HTML5 (semantic, accessible)       β”‚
β”‚  Styling       β”‚  Tailwind CSS (CDN) + Custom CSS    β”‚
β”‚  Logic         β”‚  Vanilla JS β€” ES6+, no frameworks   β”‚
β”‚  Fonts         β”‚  Fraunces + Plus Jakarta Sans       β”‚
β”‚  Storage       β”‚  localStorage (swappable)           β”‚
β”‚  Deployment    β”‚  GitHub Pages                       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Why vanilla JS? No build step. No npm install. No dependency hell.
Open index.html β†’ it works. That's the whole point.


πŸ—‚ Project Structure

taskr/
β”‚
β”œβ”€β”€ πŸ“„ index.html               ← App shell, all HTML markup & layout
β”‚
β”œβ”€β”€ πŸ“ assets/
β”‚   β”‚
β”‚   β”œβ”€β”€ πŸ“ css/
β”‚   β”‚   └── style.css           ← Custom CSS (animations, drag states, fonts)
β”‚   β”‚
β”‚   └── πŸ“ js/
β”‚       β”œβ”€β”€ utils.js            ← Pure helper functions (no side effects)
β”‚       β”‚                         generateId, formatDate, isOverdue, debounce...
β”‚       β”‚
β”‚       β”œβ”€β”€ storage.js          ← All localStorage CRUD logic
β”‚       β”‚                         Isolated: swap to Firebase by editing 1 file
β”‚       β”‚
β”‚       β”œβ”€β”€ ui.js               ← DOM rendering β€” the "view" layer
β”‚       β”‚                         createTaskCard, renderTasks, showToast...
β”‚       β”‚
β”‚       └── app.js              ← Orchestrator β€” state, events, business logic
β”‚                                 State β†’ filter β†’ render cycle lives here
β”‚
β”œβ”€β”€ πŸ“„ .gitignore
β”œβ”€β”€ πŸ“„ CONTRIBUTING.md
β”œβ”€β”€ πŸ“„ LICENSE
└── πŸ“„ README.md

Dependency Load Order

utils.js  β†’  storage.js  β†’  ui.js  β†’  app.js
   ↑               ↑           ↑          ↑
 helpers        uses Utils  uses Utils  uses all
               + Storage

Scripts are loaded in this exact order in index.html. No module bundler needed.


πŸš€ Getting Started

Prerequisites

All you need is a browser. Seriously.

# Optional: VS Code Live Server extension for hot-reload dev experience
# Extension ID: ritwickdey.LiveServer

Run Locally

# 1. Clone the repo
git clone https://github.com/YOUR-USERNAME/taskr.git

# 2. Navigate into it
cd taskr

# 3. Open in browser
# Option A: Just double-click index.html
# Option B: VS Code β†’ right-click index.html β†’ "Open with Live Server"
# Option C:
npx serve .

That's it. No npm install. No build step. No config.


🌐 Deployment

βœ… Recommended: GitHub Pages (Free, Zero Config)

Full step-by-step in DEPLOYMENT.md

Quick version:

# 1. Push your code to GitHub
git add .
git commit -m "feat: initial Taskr deployment"
git push origin main

# 2. On GitHub β†’ your repo β†’ Settings β†’ Pages
# Source: Deploy from branch
# Branch: main   /root
# Save β†’ wait 60 seconds

# 3. Your app is live at:
# https://YOUR-USERNAME.github.io/taskr

Other Free Options

Platform Deploy Method Time
Netlify Drag & drop folder at app.netlify.com/drop 10s
Vercel npm i -g vercel && vercel in project root 30s
Surge npm i -g surge && surge 30s

🧠 Architecture Decisions

These are real patterns used in production apps β€” worth understanding.

1. Separation of Concerns

Each JS file has one job and doesn't cross boundaries:

  • utils.js never touches the DOM
  • storage.js never knows about UI
  • ui.js never calls localStorage directly
  • app.js orchestrates but doesn't do the work itself

2. IIFE Module Pattern in storage.js

const Storage = (() => {
  const STORAGE_KEY = 'taskr_v1_tasks'; // Private β€” not accessible globally
  // ...
  return { getTasks, addTask, updateTask, deleteTask }; // Public API
})();

STORAGE_KEY is private. Changing storage backends later only requires editing this one file β€” nothing else breaks.

3. Centralized State β†’ Derived Data β†’ Render

// State lives in ONE place
const state = { filter: 'all', category: 'all', search: '' };

// getFilteredTasks() derives what to show from state + storage
// render() calls both and syncs to DOM

// Every user action follows this pattern:
userAction β†’ mutate state or storage β†’ render()

This is fundamentally how React, Vue, and Svelte work.

4. Debounce on Search

searchInput.addEventListener('input', Utils.debounce((e) => {
  state.search = e.target.value;
  render();
}, 200));

Without debounce, typing "hello" fires render() 5 times.
With it: fires once, 200ms after you stop typing. Real performance pattern.



🀝 Contributing

Contributions are welcome! See CONTRIBUTING.md for guidelines.


πŸ“„ License

This project is licensed under the MIT License β€” see LICENSE for details.


Built with ❀️ by Rohan Kumar

⭐ Star this repo if it helped you! It genuinely motivates continued development.

About

Taskr is a modern and intuitive web-based task manager designed to help users organize, track, and complete daily tasks efficiently. It supports task creation, editing, deletion, and progress tracking with a clean and responsive UI.

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors