Skip to content

Repository files navigation

DoIt - Advanced Todo & Project Management App

NOTE: This is still under construction and probably very buggy!

A powerful, feature-rich todo and project management application built with Next.js, TypeScript, and Tailwind CSS. Features multiple views, smart input detection, sprint planning, and comprehensive storage options.

Next.js TypeScript Tailwind CSS License

Live app: marcelerz.github.io/doit

✨ Features

Core Functionality

  • βœ… State-based Todo System - Active, Completed, Archived, Deleted states with full timestamp tracking
  • βœ… Smart Input - Natural language parsing with auto-detection of dates, people, projects, and priorities
  • βœ… Multiple Views - Todos, Kanban, Gantt, Calendar, Notes, People, Projects, Sprints, Reviews, Statistics and Time Reports, each switchable off in settings
  • βœ… People & Projects - Full entity management with assignments and mentions
  • βœ… Sprint Planning - Scrum-style sprint management with Kanban integration
  • βœ… Notes & Reviews - Rich-text notes with action items, and 1:1 review documents
  • βœ… Comments & Activity - Full history tracking on todos, notes, people, and projects
  • βœ… Time Tracking - Start/stop timers and manual entries, reported per project and person

Views

πŸ“‹ List View

  • Flexible filtering by any metadata (people, projects, tags, priorities, etc.)
  • Multiple sort options and grouping (by project, priority, due date, sprint)
  • Batch operations on multiple todos
  • Saved view presets

πŸ“Š Kanban Board

  • Customizable workflow states (Backlog, To Do, In Progress, Review, Completed, Archived)
  • Drag-and-drop between states
  • Configurable state transitions
  • Multiple board views for different workflows
  • Sprint filtering

πŸ“… Gantt Chart

  • Timeline visualization of tasks
  • Three scheduling techniques:
    • Sequential - Simple task-to-task with context switching
    • Pomodoro - 25/5/15 work/break cycles with notifications
    • Flow - Extended focus sessions (52/17 method, Ultradian rhythm)
  • Customizable time blocks (meetings, lunch, breaks)
  • Audio notifications with ambient sounds

πŸ—“οΈ Calendar View

  • Monthly calendar with task indicators
  • Click to view and edit tasks for any day

🎯 Focus View

  • Pomodoro timer with configurable work/break intervals
  • Flow mode for extended focus sessions
  • Ambient sounds for concentration
  • Task queue management

πŸ“ˆ Statistics & Time Reports

  • Task completion trends
  • Time tracking reports
  • Sprint velocity metrics

Smart Input Detection

The app automatically detects and parses:

  • Dates - "tomorrow", "next Friday", "in 2 weeks", "eod", "bow" (beginning of week)
  • Recurring - "every monday", "every 2 weeks", "every first friday"
  • People - Auto-detects names, or use @person for assignment, $person for source
  • Projects - Auto-detects "on ProjectName", "for ProjectName", or use %project
  • Priorities - Auto-detects "urgent", "high priority", or use !!priority
  • Tags - Use #tag for tagging

Storage & Data

  • Automatic IndexedDB with localStorage fallback
  • Safari Private Mode compatible
  • Automatic Migration from localStorage to IndexedDB
  • Backup & Restore with JSON export/import
  • Data Versioning with automatic migrations

πŸš€ Getting Started

Prerequisites

  • Node.js 20+ (required by Next.js 16)
  • npm

Installation

# Clone the repository
git clone https://github.com/marcelerz/doit.git
cd doit

# Install dependencies
npm install

# Start development server
npm run dev

Open http://localhost:3000 to see the app.

Production Build

# Build for production
npm run build

# Static export for GitHub Pages. GITHUB_PAGES=true is what switches on
# output: "export" and the /doit base path -- without it this build fails.
GITHUB_PAGES=true npm run build:gh-pages

The deployed app is a static export with no server: everything runs in the browser and all data stays in the browser's own storage.

Deployment

The app is published at https://marcelerz.github.io/doit/.

Pushing to main deploys it. .github/workflows/deploy.yml runs typecheck, lint and the unit tests, then builds and publishes out/ to the gh-pages branch, which GitHub Pages serves. There is nothing to run by hand.

Two things worth knowing if you build it yourself:

  • GITHUB_PAGES=true has to be in the environment. It is what switches on output: "export" and the /doit base path in next.config.ts. Nothing in package.json or the build script sets it -- only the workflow does -- so a bare npm run build:gh-pages produces an ordinary server build with no out/ directory and then fails on the next step.
  • After the export, scripts/fix-github-pages.js adds .nojekyll, copies index.html to 404.html for client-side routing, rewrites the web manifest to the /doit/ base path, and stamps the version from version.json into the service worker so each deploy ships a worker the browser sees as new.

The visual snapshots are macOS baselines and cannot run on the Linux CI runner, so run npm run test:visual locally before releasing.

πŸ§ͺ Testing

# Run unit tests
npm test

# Run tests in watch mode
npm run test:watch

# Run tests with coverage
npm run test:coverage

# Run E2E tests
npm run test:e2e

# Run smoke and visual suites
npm run test:smoke
npm run test:visual

# typecheck + lint + test + smoke + visual
npm run test:all

# the same, with the coverage floors enforced
npm run validate

πŸ“ Project Structure

doit/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ app/                    # Next.js App Router pages
β”‚   β”‚   β”œβ”€β”€ layout.tsx          # Root layout
β”‚   β”‚   β”œβ”€β”€ page.tsx            # Main app page
β”‚   β”‚   └── settings/           # Settings page
β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”œβ”€β”€ views/              # Main views (TodoApp is the container)
β”‚   β”‚   β”œβ”€β”€ items/              # List item components
β”‚   β”‚   β”œβ”€β”€ overlays/           # Modal/detail views
β”‚   β”‚   β”œβ”€β”€ input/              # SmartInput, RichTextEditor
β”‚   β”‚   β”œβ”€β”€ shared/             # Reusable components
β”‚   β”‚   β”œβ”€β”€ settings/           # Settings tab components
β”‚   β”‚   └── providers/          # App-level React providers
β”‚   β”‚       β”œβ”€β”€ ServiceWorkerProvider.tsx  # PWA service worker
β”‚   β”‚       β”œβ”€β”€ StorageInitializer.tsx     # Storage initialization
β”‚   β”‚       └── ThemeProvider.tsx          # Dark/light theme
β”‚   β”œβ”€β”€ hooks/                  # React hooks (state management)
β”‚   β”‚   β”œβ”€β”€ useTodos.ts         # Todo state management
β”‚   β”‚   β”œβ”€β”€ usePeople.ts        # People management
β”‚   β”‚   β”œβ”€β”€ useProjects.ts      # Projects management
β”‚   β”‚   β”œβ”€β”€ useSprints.ts       # Sprint management
β”‚   β”‚   └── useSettings.ts      # App settings
β”‚   β”œβ”€β”€ models/                 # Business logic layer
β”‚   β”‚   β”œβ”€β”€ TodoModel.ts        # Todo business logic
β”‚   β”‚   β”œβ”€β”€ PersonModel.ts      # Person business logic
β”‚   β”‚   β”œβ”€β”€ ProjectModel.ts     # Project business logic
β”‚   β”‚   └── SettingsModel.ts    # Settings business logic
β”‚   β”œβ”€β”€ storage/                # Storage abstraction
β”‚   β”‚   β”œβ”€β”€ storage.ts          # IndexedDB/localStorage adapters
β”‚   β”‚   β”œβ”€β”€ migrations.ts       # Data migrations
β”‚   β”‚   └── backup.ts           # Backup/restore functionality
β”‚   β”œβ”€β”€ types/                  # TypeScript types, one file per domain
β”‚   β”‚   β”œβ”€β”€ todo.ts             # Todo types and branded TodoId
β”‚   β”‚   β”œβ”€β”€ viewRegistry.ts     # The single source for the view tabs
β”‚   β”‚   └── settings.ts         # Settings types
β”‚   └── utils/                  # Utility functions
β”‚       β”œβ”€β”€ autoDetection.ts    # Smart input detection
β”‚       β”œβ”€β”€ dateUtils.ts        # Date parsing
β”‚       β”œβ”€β”€ recurringParser.ts  # Recurring pattern parsing
β”‚       β”œβ”€β”€ ganttScheduler.ts   # Gantt scheduling algorithms
β”‚       └── notifications.ts    # Sound/notification utilities
β”œβ”€β”€ public/
β”‚   └── sounds/                 # Ambient sounds for focus mode
β”œβ”€β”€ docs/                       # Documentation
└── package.json

πŸ—οΈ Architecture

Model Abstraction Layer

The app uses a business logic layer that wraps raw data with computed properties and validation:

// useTodos returns models, so todos[0] is already a TodoModel
const todo = todos[0];
todo.isOverdue; // Computed: is past due date?
todo.dueDateDisplay; // "Today", "Tomorrow", "Dec 15"
todo.canComplete(todos); // Validates dependencies
todo.matchesSearch(q); // Full-text search

Storage Abstraction

Automatic storage selection with migration:

// Automatic IndexedDB with localStorage fallback
import { loadFromStorage, saveToStorage, waitForStorageInit } from "@/storage/storage";

// Await initialization first, or on an IndexedDB install you read an
// emptied localStorage and persist the fallback over the user's data
await waitForStorageInit();
const data = await loadFromStorage("doit-todos", []);
await saveToStorage("doit-todos", updatedData);

Hooks Architecture

Each data domain has its own hook:

  • useTodos() - Returns TodoModel[] with full CRUD
  • usePeople() - Returns PersonModel[] with assignments
  • useProjects() - Returns ProjectModel[] with linking
  • useSprints() - Sprint management
  • useSettings() - App configuration

βš™οΈ Configuration

Settings Tabs

  • General - Archive retention, auto-delete
  • Priorities - Custom priority levels with colors
  • Categories - Project categories
  • Date/Time - Morning, noon, afternoon, evening times
  • Work Hours - Schedule configuration, time blocks
  • Gantt - Scheduling technique settings
  • Focus - Pomodoro/Flow mode configuration
  • Calendar - Calendar display options
  • Notes - Note defaults and templates
  • Import - Import from Todoist and other CSV exports
  • Kanban - Workflow states, transitions, views
  • Sprints - Sprint management, default duration
  • Auto-Assign - Default metadata for new todos
  • Markers - Color customization
  • Links - URL pattern detection
  • Notifications - Browser notification settings
  • Backup - Export/import data
  • Storage - IndexedDB/localStorage settings

Markers Reference

Marker Usage Example
@ Assign person @john
$ Source person $sarah
% Project %website
!! Priority !!urgent
# Tag #bug

🎨 Styling

  • Tailwind CSS 4 - Utility-first styling
  • Dark Mode - Automatic system preference detection
  • Mobile-First - Fully responsive design
  • Custom Theme - Configurable marker colors

πŸ“± Browser Support

  • Chrome/Edge (recommended)
  • Firefox
  • Safari (including Private Mode)
  • Mobile browsers

πŸ› οΈ Tech Stack

  • Framework: Next.js 16 with App Router
  • Language: TypeScript 5
  • Styling: Tailwind CSS 4
  • Date Parsing: chrono-node
  • Storage: IndexedDB + localStorage
  • Audio: Web Audio API
  • Testing: Jest + Playwright

πŸ“„ License

Personal Use License - This software is available for personal, non-commercial use only. Commercial use, redistribution, and derivative works are prohibited. See LICENSE for full details.

🀝 Contributing

This is a personal project under a Personal Use License, which does not permit redistribution or derivative works -- so there is no open contribution process. Bug reports and suggestions are welcome as issues.

πŸ“š Documentation

Additional documentation is available in the docs/ folder:

About

Todo App Project

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages