Claude and Cursor plan and update tasks over MCP. Agents propose, you approve: every change waits for one tap.
Working with agents stays low-effort: one calm board, changes in plain words, nothing leaving your machine.
A real MCP connection (a scripted demo agent) asking for three changes. Nothing moves until they're approved.
|
Claude Code, Cursor and any MCP client get 19 tools to plan work, break it into subtasks, log progress and finish tasks, through the same rules you use. |
Agents propose, you approve. Changes from agents and from the built-in assistant wait on an approval card, in plain words, until you tap Apply. Trust an agent? Let it apply right away. |
One SQLite file. No account, no cloud, no telemetry. Pair it with Ollama or LM Studio and even the AI runs locally. |
In the agentic AI era, the hard part isn't getting AI to do work. It's keeping up with it. Every new agent is one more thing to watch, one more place where work happens, one more stream of updates to read.
I wanted the opposite: a task board that gets calmer as AI gets more capable. One place where my agents and I share the same list, where I can see what happened at a glance, where nothing changes behind my back, and where the screen stays quiet enough to think. Task Tracker is that board.
| You are⦠| What Task Tracker gives you |
|---|---|
| A developer working with coding agents | Your agent plans the work, breaks it into subtasks, logs progress and completes tasks over MCP. You approve its changes in one tap and see everything on one board. |
| Privacy-first | Everything local: one SQLite file, no account. Run the assistant on Ollama or LM Studio and nothing leaves your machine. |
| Easily overwhelmed by tools | Four columns, no Save buttons, deadlines in plain words, and an assistant you can ask "What should I focus on today?", by typing or by voice. |
| An AI power user | Humans, the assistant and agents all go through one data layer, so the rules always match. Plan on a timeline and drag to reschedule. |
Who it's not for: teams that need shared boards and permissions, sync across devices through a cloud account, or enterprise project management with resource planning. Task Tracker is for individuals who want calm over features, local over cloud, and AI as a helper rather than a replacement.
"Calm" isn't a mood here; it's a set of promises:
- Four columns to start, not a workflow designer.
- Everything autosaves. There's no Save button anywhere.
- Deadlines read like a person wrote them: Due in 3h, Overdue by 2d.
- Agents ask first. Their changes wait for your OK, spelled out in plain words, and you approve them in one tap.
- The assistant proposes, you approve, and it can't delete anything.
- Agents show up where you already look: on the board, live, with no extra dashboard to check.
- Each reminder fires once, and a burst arrives as a single summary.
- Errors are plain sentences with a next step, never a stack trace.
- What you don't need is folded away: undated tasks, hidden columns and the archive stay out of sight until you ask.
git clone https://github.com/Parv17k/tasktracker.git
cd tasktracker
npm install # installs dependencies and builds the UI
npm start # β http://localhost:1717That's it. No database to install and no config files. SQLite is built into Node 22.13+, so there's nothing native to compile either.
Task Tracker ships with a Model Context Protocol server, so your agent can keep track of its own work, or yours.
Claude Code
claude mcp add tasktracker -- node /absolute/path/to/tasktracker/mcp/index.jsClaude Desktop, Cursor, Windsurf and other MCP clients
{
"mcpServers": {
"tasktracker": {
"command": "node",
"args": ["/absolute/path/to/tasktracker/mcp/index.js"]
}
}
}Then just ask:
"What's overdue across all my projects?" "Break task #3 into subtasks, tag it #backend and move it to In Progress." "Log what you just did on #12 and mark it complete."
All 19 MCP tools
| Tool | What it does |
|---|---|
list_projects |
Every project with priority, tags, task counts per column and deadlines. A good first call |
create_project |
New project with its own board, priority and tags |
update_project |
Rename, re-icon, set priority, or add/remove tags |
get_board |
Columns and tasks of one project (project: "website", fuzzy) |
list_tasks |
Search across all projects or one: column, text, tag, due_within_days, overdue, archived |
get_task |
Full details, including subtask ids |
create_task |
Project, column, title, description, note, priority, start and due dates, subtasks, tags |
update_task |
Change any field (due: "" / start: "" clear dates), add_tags / remove_tags |
move_task |
Move by column name (fuzzy: "in prog" works) or id |
complete_task |
Move to the done column, optionally appending a summary |
archive_task |
Archive, or restore with archived: false |
append_note |
Add a timestamped line to the note (great for progress logs) |
add_subtasks |
Add checklist items |
update_subtask |
Check, uncheck or rename a subtask |
delete_subtask |
Remove a subtask |
track_time |
Start or stop the time-spent timer |
list_columns |
A project's columns with ids, hidden flags and the done column |
list_tags |
Every tag with how many tasks and projects use it |
get_request |
Whether a change request was approved, and the ids of anything it created |
By default, an agent can read everything but can't change your board on its own. Each write becomes a request in the π€ Agent requests inbox:
- A gentle toast tells you "Claude Code wants to make 3 changes"; nothing interrupts you more than that.
- Each change is spelled out in plain words, with a checkbox. Untick what you don't want, then Apply, or Dismiss the lot.
- The agent is told what happened (
get_request), including the ids of anything it created, so it can carry on. - Trust an agent? Switch the inbox to Apply right away and its changes land directly, live on the board.
The MCP server works on the same SQLite file as the app, so agents can read your board even when the web server isn't running. When it is, open tabs update live within about half a second.
Click β¨ in the top bar. Connect any OpenAI-compatible provider once (one-click presets for OpenAI, OpenRouter, Groq, Ollama and LM Studio), and your board gains an assistant.
|
|
|
|
"What should I focus on today?" A real, unedited answer from a self-hosted open model, grounded in the board behind it.
π What leaves your machine? Only when you ask: a summary of your tasks (and, by voice, your recording) goes to the provider you chose. Your API key is stored locally and never reaches the browser, which only ever sees
β¦last4. Point it at Ollama or LM Studio and even that stays local.
- Totals and status breakdown for each project, with a progress ring, overdue and due-this-week counts
- Priority and tags on projects: mark what matters most, and filter the home page by tag (
work,personal,Q4β¦) - Coming up: everything due in the next 7 days across all projects; click a card to open that task
- Drag projects to reorder them; create, edit, archive or delete them. New projects start with four columns, or copy another project's
Switch any board to Timeline. It's a Gantt chart without the clutter:
- A bar from start to deadline, or a β when a task only has a deadline, grouped by column and coloured to match it
- Drag to reschedule: move a bar, drag its ends to change dates, or pull a β out into a bar. Arrow keys work too, and times of day are kept
- Today is always in view; overdue items are red with "Overdue 2d"; finished ones fade
- Weeks or Months zoom, and the board's search, tag and deadline filters apply
On the home page, switch Projects to Timeline to see every project at once: one row each, with a β for every deadline, so busy weeks stand out. Expand a project to see and reschedule its tasks right there.
|
|
|
Press N and type naturally:
|
Every field autosaves. Status, priority, deadline, start date, timer, tags, subtasks and note live in one calm panel.
- Shared by tasks and projects, with suggestions as you type and a stable colour per tag
- Names ignore case, so
Designanddesignare one tag; unused tags disappear on their own - Manage tags to rename, recolour or delete one everywhere at once
Task Tracker is a Progressive Web App: click Install in the top bar (Chrome, Edge, or Safari's Add to Dock) and it gets its own window and Dock/taskbar icon. Turn on reminders from the π bell:
| Reminder | When | Adjustable |
|---|---|---|
| The day before | at your morning time (default 9:00) | on/off, time |
| The morning it's due | at your morning time | on/off |
| Before a due time | for tasks with a time, e.g. 1 hour before | on/off, 15 min to 1 day |
| When it becomes overdue | at the due time, or the next morning for all-day tasks | on/off |
- Works with the app closed: the local server sends reminders through the browser's push service, signed with keys generated on your machine. No account needed.
- Calm by design: each reminder fires once, done tasks never remind you, and a burst (say, after your laptop wakes) arrives as one summary.
- Click a notification to jump straight to that task.
Reminders while the app is closed need the Task Tracker server running and an internet connection for the browser's push service. Open windows also receive them over the local live-update stream.
Twenty-four themes designed for focus. Switch instantly from the brush icon; your choice applies everywhere and is remembered.
Also included: Paper Β· New York Β· Nordic Frost Β· Sage Garden Β· Espresso Library Β· Graphite Β· Grayscale Dark Β· Crimson Β· Ivy Β· Cardinal Β· Sunset Orange Β· Harbor Gold
flowchart LR
subgraph clients[" π₯ Clients "]
direction TB
UI["π₯οΈ <b>React UI</b><br/><small>Board Β· Timeline Β· Chat Β· Voice</small>"]
AGENT["π€ <b>AI Agent</b><br/><small>Claude Β· Cursor Β· any MCP client</small>"]
end
subgraph node[" βοΈ Node.js "]
direction TB
API["β‘ <b>Fastify API</b><br/><small>server/index.js Β· REST + SSE</small>"]
CHAT["β¨ <b>Assistant</b><br/><small>chat.js Β· actions.js Β· voice</small>"]
MCP["π <b>MCP Server</b><br/><small>mcp/index.js Β· 19 tools</small>"]
CORE["π§ <b>Shared data layer</b><br/><small>server/db.js Β· rules & validation</small>"]
WATCH["π <b>Change watcher</b><br/><small>PRAGMA data_version</small>"]
end
DB[("ποΈ <b>SQLite Β· WAL</b><br/><small>~/.tasktracker/tasktracker.db</small>")]
LLM["π§ <b>Your LLM</b><br/><small>chat Β· speech-to-text Β· voice<br/>OpenAI Β· Groq Β· Ollama Β· LM Studio</small>"]
UI -->|"HTTP Β· JSON<br/>optimistic updates"| API
API -.->|"SSE Β· live updates"| UI
AGENT <-->|"stdio Β· JSON-RPC"| MCP
API --> CORE
API --> CHAT
CHAT --> CORE
CHAT <-->|"OpenAI-compatible API<br/>streamed"| LLM
MCP --> CORE
CORE <-->|"~1 ms queries"| DB
DB -.->|"writes from<br/>other processes"| WATCH
WATCH -.->|"broadcast"| API
classDef client fill:#eef2ff,stroke:#6366f1,stroke-width:2px,color:#1e1b4b
classDef agent fill:#f5f3ff,stroke:#8b5cf6,stroke-width:2px,color:#2e1065
classDef server fill:#ecfdf5,stroke:#10b981,stroke-width:2px,color:#064e3b
classDef core fill:#fff7ed,stroke:#f97316,stroke-width:2.5px,color:#431407
classDef watch fill:#f0f9ff,stroke:#0ea5e9,stroke-width:1.5px,stroke-dasharray:4 3,color:#082f49
classDef db fill:#fefce8,stroke:#ca8a04,stroke-width:2.5px,color:#422006
classDef llm fill:#fdf2f8,stroke:#db2777,stroke-width:2px,stroke-dasharray:5 3,color:#500724
class UI client
class AGENT agent
class API,MCP,CHAT server
class CORE core
class WATCH watch
class DB db
class LLM llm
style clients fill:transparent,stroke:#94a3b8,stroke-width:1px,stroke-dasharray:6 4,color:#64748b
style node fill:transparent,stroke:#94a3b8,stroke-width:1px,stroke-dasharray:6 4,color:#64748b
- One data layer (
server/db.js) holds every business rule, shared by the API, the assistant and the MCP server, so humans and agents always behave the same way. - Grounded chat without tool calling: the server sends the model a compact, budgeted snapshot of your board, and the model proposes changes as a small structured block that the app validates and shows for approval. It works even with small local models. Your API key never reaches the browser.
- Live sync without polling the API: the server watches SQLite's
PRAGMA data_versionand pushes changes from other processes to browsers over Server-Sent Events. - WAL mode lets the web app and an agent write at the same time.
- Optimistic UI with fractional ordering means drag & drop, on the board or the timeline, never waits on the server.
β¨ Ask: from your question to an answer, and changes you approve
sequenceDiagram
autonumber
actor You
participant UI as π₯οΈ Browser
participant API as β‘ Fastify API
participant DB as ποΈ SQLite
participant LLM as π§ Your LLM
You->>UI: "What should I focus on today?" (typed or spoken)
UI->>API: POST /api/chat (conversation + open project)
API->>DB: active projects, columns, tasks
API->>API: build a compact snapshot<br/>(local dates, due labels, priorities, tags)
API->>LLM: system prompt + snapshot + conversation<br/>(your key is added here, server-side)
LLM-->>API: streamed tokens
API-->>UI: streamed text
Note over UI: Answer appears word by word β¨<br/>and can be read aloud π
opt the answer proposes changes
UI->>API: preview the proposed changes
API-->>UI: plain-language list, checked against the board's rules
UI->>You: approval card: tick what you want
You->>UI: Apply
UI->>API: apply the approved changes
API->>DB: one transaction, all or nothing
API-)UI: board updates live
end
β‘ Live sync: an agent's change appears on your board
sequenceDiagram
autonumber
participant AI as π€ AI Agent
participant MCP as π MCP Server
participant DB as ποΈ SQLite
participant API as β‘ Fastify API
participant UI as π₯οΈ Browser
AI->>MCP: complete_task(id: 12, note: "Shipped β
")
alt Ask me first (default)
MCP->>DB: save a request for your approval
MCP-->>AI: waiting for approval (request 7)
Note over DB: You tap Apply in the inbox
DB->>DB: append note + move to Done (one transaction)
else Apply right away
MCP->>DB: append note + move to Done (one transaction)
MCP-->>AI: β Completed task 12 β Done
end
loop every 500 ms
API->>DB: PRAGMA data_version
end
DB-->>API: version changed
API-)UI: SSE event: change
UI->>API: GET /api/board
API-->>UI: full board (~1 ms)
Note over UI: Card glides into Done β¨<br/>no refresh needed
π Reminders: from a deadline to your screen
sequenceDiagram
autonumber
participant REM as β° Reminder engine
participant DB as ποΈ SQLite
participant PUSH as βοΈ Browser push service
participant SW as π Service worker
actor You
loop every minute
REM->>DB: open tasks with deadlines
end
REM->>REM: due and not yet sent?
REM->>DB: log it (each reminder fires once)
REM->>PUSH: Web Push, signed with local VAPID keys
PUSH->>SW: deliver, even if the app is closed
SW->>You: "Due in 30 min Β· Send proposal"
You->>SW: click
SW-->>You: opens that task
| Layer | Tech |
|---|---|
| Frontend | React 19 Β· Vite Β· Tailwind CSS v4 Β· Radix UI Β· dnd-kit Β· Zustand Β· Sonner |
| Backend | Node.js Β· Fastify Β· node:sqlite Β· web-push |
| AI | Any OpenAI-compatible API: /chat/completions (streaming), /audio/transcriptions, /audio/speech Β· @modelcontextprotocol/sdk Β· Zod |
| App | Web App Manifest Β· Service Worker Β· Push & Notifications Β· MediaRecorder & Web Speech |
Configuration
| Env var | Default | |
|---|---|---|
PORT |
1717 |
Web server port |
HOST |
127.0.0.1 |
Bound to localhost only by default |
TASKTRACKER_DB |
~/.tasktracker/tasktracker.db |
Shared by the web app and the MCP server |
The AI provider (and optional voice models) is configured in the app (β¨ β settings) and stored in the same database.
REST API
| Method | Endpoint | |
|---|---|---|
GET |
/api/home |
Every project with stats, tasks due soon, and all tags |
GET / POST |
/api/projects |
List or create projects |
GET |
/api/projects/:id/board |
A project's columns and active tasks, with subtasks and tags |
PATCH / DELETE |
/api/projects/:id |
Edit (incl. priority and tags), archive or delete a project |
POST |
/api/projects/:id/move |
{ index } to reorder |
GET |
/api/timeline |
Active projects with their dated tasks, for the home-page timeline |
GET |
/api/tasks?project=&q=&tag=&column=&overdue=&dueWithinDays=&archived= |
Search and filter |
POST |
/api/tasks |
Create |
PATCH |
/api/tasks/:id |
Update fields (incl. startAt, dueAt, tags), archive or restore |
POST |
/api/tasks/:id/move |
{ columnId, index } |
POST |
/api/tasks/:id/complete |
Move to the done column |
POST |
/api/tasks/:id/timer/start Β· /stop |
Time tracking |
POST |
/api/tasks/:id/subtasks |
Add a subtask |
PATCH / DELETE |
/api/subtasks/:id |
Update or delete a subtask |
POST / PATCH / DELETE |
/api/columns[/:id] |
Manage columns (POST { projectId, β¦ }, DELETE ?moveTo=<id>) |
GET |
/api/tags |
Every tag with its colour and usage counts |
PATCH / DELETE |
/api/tags/:id |
Rename or recolour a tag everywhere, or delete it |
GET / PATCH |
/api/settings/reminders |
Reminder preferences |
GET |
/api/push/key |
Public VAPID key for subscribing |
POST |
/api/push/subscribe Β· /unsubscribe |
Register or remove a browser for push |
POST |
/api/push/test |
Send a test notification |
GET / PATCH |
/api/settings/llm |
AI provider (base URL, model, key, voice models). The key is write-only |
GET |
/api/chat/models |
Models offered by the provider (also a connection test) |
POST |
/api/chat |
{ messages, projectId }, streams the reply as plain text |
POST |
/api/chat/actions/preview Β· /apply |
Check, then apply, changes the assistant proposed |
GET |
/api/proposals?status=pending|recent |
Change requests from agents |
POST |
/api/proposals/:id/apply Β· /dismiss |
Approve (optionally { selected }) or dismiss a request |
GET / PATCH |
/api/settings/agents |
{ approval: "ask" | "auto" } |
POST |
/api/chat/transcribe |
Raw audio body β { text } |
POST |
/api/chat/speech |
{ text } β audio |
GET |
/api/events |
Server-Sent Events stream (change, reminder) |
Task Tracker is young and moving fast. Here's where it's heading, and every item is open for contributors. Comment on an issue (or open one) to claim it.
- β Agents ask first: MCP changes wait in an approval inbox (or apply right away, your choice)
- ποΈ Voice: talk to the assistant and hear it answer, hands-free
- β Assistant actions with an approval card for every change, and plain-language errors
- ποΈ Timeline (Gantt) per project and across projects, with drag to reschedule and optional start dates
- π·οΈ Tags on tasks and projects, and project priority
- β¨ AI chat with any OpenAI-compatible provider, grounded in your board
- ποΈ Multiple projects with a home page, drag-to-reorder projects and columns
- π² Installable app with deadline reminders that work while it's closed
- π¨ Twenty-four themes
| Idea | What it means | Status |
|---|---|---|
| Planning agent | Watches your timeline and proactively proposes fixes: spread out a crowded week, move what's slipping, break big goals into tasks. Every change still goes through the approval card | π§ͺ Designing |
| Daily briefing | A morning note, spoken or written: what's due, what's at risk, and a suggested plan for the day | π Planned |
| Weekly review | What you finished, what slipped, and where your time went, from the timer data | π Planned |
| Undo for applied changes | One click to roll back everything the assistant just applied | π Help wanted |
| Native tool calling | Use the provider's function calling when available, with the approval card as the fallback | π Help wanted |
| Natural-language capture | "Remind me to renew insurance next Friday, high priority, #bills" β a fully filled task | π Help wanted |
| Risk radar | Flags tasks likely to slip, from deadlines, subtask progress and how long similar tasks took | π§ͺ Exploring |
| Semantic search | Find tasks by meaning, with local embeddings, so it works offline | π§ͺ Exploring |
| Remote MCP | Streamable-HTTP transport, so agents on other machines can connect | π Help wanted |
| Idea | Status |
|---|---|
| π― Goals: link tasks to longer-term goals and track progress toward them | π Planned |
| π Task dependencies: "blocked by #12", drawn as links on the timeline | π§ͺ Exploring |
| π Recurring tasks: daily, weekly, monthly, or custom | π Help wanted |
| πΎ Saved filters: a tag + deadline + search combination one click away | π Help wanted |
| ποΈ Calendar view: a month grid of deadlines | π Help wanted |
| π Focus mode: one task, a Pomodoro timer, everything else hidden | π Help wanted |
| π Task templates for repeatable checklists | π Help wanted |
| π Move tasks between projects | π Help wanted |
| Idea | Status |
|---|---|
| π₯ Import from Trello, Todoist and GitHub Issues | π Help wanted |
| π€ Export a board as Markdown or JSON, and one-click backups | π Help wanted |
| π± Phone access on your local network with HTTPS, so phones can install the app | π§ͺ Exploring |
| π Optional sync between your own devices, still with no cloud account | π§ͺ Exploring |
| β¨οΈ Command palette (βK) and a keyboard shortcuts sheet (?) | π Help wanted |
| π Translations and an accessibility audit | π Help wanted |
π§ͺ Exploring: open design question Β· π Planned: agreed direction Β· π Help wanted: ready to pick up
npm run dev # API on :1717 + Vite with hot reload on :5173
npm test # data layer, reminders, tags, timeline, chat, actions and voice tests (node:test)
npm run build # production build of the UIContributions of every size are welcome, from fixing a typo to adding a theme or building the planning agent. If this is your first open-source contribution, even better: we'd love to help you land it.
- Read the Contributing Guide. It takes about 3 minutes.
- Pick something from the roadmap, look for issues labelled
good first issue, or browse the ideas list. - Fork, branch, code, and open a pull request.
Not sure where to start? Open an issue and say hi. π
Please be kind, be patient, and assume good intent.
If Task Tracker helps you stay focused, consider starring the repo. It helps others find it.
MIT Β© Parv Khatri