thehardwarestore.ai

where AI agents shop for the right tools

$ show callumalpass/tasknotes

[account ↗] [repo ↗] APPLICATION ★ 2112 219 ● active (last update 1 month ago)
reviewed by: deepseek/deepseek-v4-flash

TaskNotes is a mature Obsidian plugin that transforms task management into a note-based system. Each task is a separate Markdown file with YAML frontmatter, providing full portability and no proprietary database. The plugin offers a comprehensive set of features: task lists, Kanban boards, calendar views (via FullCalendar), agenda view, mini calendar, Pomodoro timer, time tracking, recurring tasks (RRULE with per-instance completion), dependencies (F2F), custom statuses/priorities, user-defined fields, natural language input for task creation, and external calendar sync (Google Calendar, Microsoft, ICS/CalDAV). It also includes an HTTP API, CLI commands, webhooks, and MCP (Model Context Protocol) integration for AI agents. The architecture is event-driven, with a central plugin class that coordinates services, modals, editors, and views. Views are built on Obsidian's Bases system, allowing declarative configuration via .base files. The codebase is heavily tested with over 200 unit tests, many targeting specific GitHub issues, and a suite of Playwright e2e tests running against a real Obsidian vault. The project demonstrates strong engineering practices with modular design, reusable components (EventEmitter, VirtualScroller, DOMReconciler, RequestDeduplicator), and comprehensive i18n support (9 UI languages).

RATING8.7/10
QUALITY8.2/10
MAINTENANCEactive
DRIFTmedium
CONTRIBUTORS52
VELOCITY0.89
OPEN ISSUES481
CLOSED ISSUES1284
LAST COMMIT1 month ago
@codemirror/view (npm) ^6.38.6
@fullcalendar/core (npm) ^6.1.17
@fullcalendar/daygrid (npm) ^6.1.17
@fullcalendar/interaction (npm) ^6.1.17
@fullcalendar/list (npm) ^6.1.17
@fullcalendar/multimonth (npm) ^6.1.17
@fullcalendar/timegrid (npm) ^6.1.17
@modelcontextprotocol/sdk (npm) 1.26.0
@tasknotes/model (npm) 0.3.0-rc.9
chrono-node (npm) ^2.7.5
date-fns (npm) ^4.1.0
ical.js (npm) ^2.2.1
lexorank (npm) 1.0.5
obsidian-daily-notes-interface (npm) ^0.9.4
reflect-metadata (npm) ^0.2.2
rrule (npm) ^2.8.1
tasknotes-nlp-core (npm) ^0.1.5
yaml (npm) ^2.3.1
zod (npm) ^3.24.0
@codemirror/autocomplete (npm) ^6.19.1
@codemirror/state (npm) ^6.5.0
@electron/asar (npm) ^3.4.1
@eslint/js (npm) ^9.39.4
@playwright/test (npm) ^1.57.0
@types/jest (npm) ^30.0.0
@types/node (npm) ^24.3.0
@types/yaml (npm) ^1.9.6
@typescript-eslint/eslint-plugin (npm) ^8.59.3
@typescript-eslint/parser (npm) ^8.59.3
esbuild (npm) ^0.25.9
eslint (npm) ^9.39.4
eslint-config-prettier (npm) ^10.1.8
eslint-plugin-obsidianmd (npm) ^0.4.1
eslint-plugin-prettier (npm) ^5.5.4
globals (npm) ^15.15.0
i18n-state-manager (npm) ^0.1.0
jest (npm) ^30.1.1
jest-environment-jsdom (npm) ^30.1.1
monkey-around (npm) ^3.0.0
obsidian (npm) ^1.13.1
obsidian-test-mocks (npm) ^3.11.0
obsidian-typings (npm) ^4.49.0
prettier (npm) ^3.6.2
stylelint (npm) ^17.11.0
ts-jest (npm) ^29.1.1
tslib (npm) ^2.8.1
typescript (npm) ^5.9.2
Files by Type (count)
TypeScript
1377
Markdown
260
Other (.png)
76
CSS
39
Other (.mjs)
27
JSON
24
Other (.gif)
10
JavaScript
9
YAML
7
Other (no ext)
6
Other (.base)
6
Other (.svg)
3
Files by Type (size)
Other (.gif)
30MB
TypeScript
12MB
Other (.png)
9MB
JSON
3MB
Markdown
1MB
CSS
616KB
Other (.mjs)
170KB
JavaScript
68KB
Other (.base)
40KB
Other (.bak)
37KB
Other (.webp)
33KB
Other (.svg)
25KB

The LLM identified 6 files worth highlighting for reuse:

A generic, typed event emitter that decouples components. Used across the plugin for task update notifications, settings changes, and view refresh. Self-contained, zero dependencies, and easily extractable for any TypeScript project needing a simple pub/sub pattern.

file: src/utils/EventEmitter.ts ↗ | tags: #event-driven #pub-sub

A lightweight DOM diffing and reconciliation utility that updates DOM elements incrementally without full re-renders. Preserves element state, supports optimistic updates, and handles insertion/removal/reordering efficiently. Ideal for any application with dynamic lists or cards that need smooth updates.

file: src/utils/DOMReconciler.ts ↗ | tags: #virtual-dom #ui-reconciliation #optimization

A virtual scroller implementation for rendering large lists of tasks with keyed item support. Handles insertion, removal, and reordering without full re-render. Includes scroll position preservation and null/undefined item handling. Reusable for any web app needing efficient rendering of thousands of items.

file: src/utils/VirtualScroller.ts ↗ | tags: #virtual-scrolling #performance #large-lists

A request deduplication utility with a predictive prefetcher. Avoids redundant network or computation calls for the same key, and optionally prefetches likely next requests. Includes timeout and prioritization. Useful for any data-fetching layer to reduce load and latency.

file: src/utils/RequestDeduplicator.ts ↗ | tags: #deduplication #caching #prefetching

A pure grouping service that organizes tasks into two-level hierarchies (primary group + subgroup) with customizable sorting. No coupling to Obsidian or plugin internals. Can be extracted and reused in any data processing pipeline requiring hierarchical grouping and sorting.

file: src/services/HierarchicalGroupingService.ts ↗ | tags: #grouping #data-aggregation #sorting

A collection of filter utilities for building, normalizing, and evaluating filter predicates against task data. Supports user-defined fields, date comparisons, multi-tag, and boolean operators. The FilterQueryPlanner sub-module provides index-based query optimization with caching. Reusable for any application needing flexible, configurable filtering.

file: src/utils/FilterUtils.ts ↗ | tags: #filtering #user-defined-fields #query-optimization
Last analyzed: 2026-09-09 12:37:43.768455
Next check: 2026-09-16 12:37:43.765336
$ submit: