My daily-driver task manager - local-first, with time tracking and AI integration.
Napirend (pronounced "NAH-peer-end"): Hungarian for "agenda" or "daily schedule" - a fitting name for a task manager built to structure your day.
I searched everywhere for a great task manager with built-in time tracking, but every good option locked time tracking behind an unjustifiably expensive subscription.
So I built NAPIREND - the task manager I wanted but couldn't find:
- Quality: Every detail refined until it met my own high standards.
- Time Tracking built-in: Estimate hours, track actual time, see the difference.
- Local Data Storage: Task data lives in a simple JSON file, no database setup required.
- AI Ready: AI assistants can optionally access and manage your tasks.
| Task Board | Collapsible groups with drag-and-drop reordering |
![]() |
| Time Tracking | Per-task timer with estimated vs. actual hours |
![]() |
| Filtering | Search tasks, filter by status or project |
![]() |
| Projects | Color-coded labels to organize your work |
![]() |
| Auto-assign | If a task mentions a project, it is automatically assigned |
![]() |
| Quick Entry | Add multiple tasks without touching your mouse |
![]() |
| Markdown Notes | Record additional context for every task |
![]() |
| Bulk Actions | Select multiple tasks to move, update, or delete |
![]() |
| MCP Server | AI assistants can create, update, and track tasks |
![]() |
| Real-time Sync | AI task updates show up instantly in the browser |
![]() |
Click to expand full feature list
-
Task Management
- Create tasks with inline input (Enter to add, stays focused for rapid entry)
- Edit task titles inline (click to edit, Enter to save, Escape to cancel)
- Delete tasks with confirmation dialog
- Task properties
- Title (max 200 characters, trimmed)
- Description/notes (markdown, max 2000 characters)
- Status: pending, in_progress, completed
- Project assignment (optional)
- Estimated hours (decimal, e.g., 2.5)
- Order within group
- Auto-project assignment: if title contains a project name, it's auto-assigned
- Completed tasks show strikethrough styling
- Notes badge indicator on tasks with descriptions
-
Time Tracking
- Per-task start/stop timer with play/pause button
- Timer display in HH:MM format (no upper limit, e.g., "105:30")
- Timer state persists across page refresh (server-stored)
- Multiple tasks can have running timers simultaneously
- Display updates every 10 seconds while running
- Estimated hours input per task
- Group header shows spent/estimated time with percentage (e.g., "01:30/03:00 (50%)")
- Auto-stop timer when marking task as completed
-
Groups (Sprints)
- Create groups via navbar input
- Rename groups inline (click name to edit)
- Delete groups with confirmation (blocked if group has tasks)
- Collapsible groups (click arrow to toggle)
- Drag-and-drop reordering of groups
- Task count per group
- Aggregated time tracking per group (sum of all task times)
- "Select All" button per group for bulk operations
-
Projects
- Create projects with custom name and colors
- Edit project name, background color, and text color
- Delete projects (blocked if tasks reference it)
- Color picker with native input and hex text input
- Case-insensitive unique names
- Alphabetically sorted
- Manage via "Manage Projects..." modal in navbar
-
Filtering & Search
- Text search (case-insensitive, matches task titles)
- Multi-select status filter (checkboxes in dropdown)
- Multi-select project filter (includes "Unset" option)
- Filters combine with AND logic
- Groups with no matching tasks are hidden when filters active
- Task count display: "Showing X of Y tasks" when filtered
- Clear button resets all filters
- Sticky filter bar below navbar
-
Bulk Operations
- Multi-select tasks via checkboxes
- Bulk action bar (always visible)
- Move selected tasks to a group
- Set status for all selected tasks
- Set project for all selected tasks
- Bulk delete with confirmation dialog
- Selection persists after move/status/project changes
- Selection cleared after bulk delete
-
Drag and Drop
- Reorder tasks within a group
- Move tasks between groups
- Reorder groups on the board
- Drop indicator lines show insertion point
- Visual feedback during drag (opacity, highlight)
- Uses Atlassian's Pragmatic Drag and Drop library
-
UI/UX Features
- Task details drawer (right-side offcanvas)
- Markdown rendering with click-to-edit
- Character count display
- Opens on right-click of task row
- Confirmation dialogs for destructive actions
- Keyboard shortcuts
- Enter: save/submit
- Escape: cancel/close
- Sticky header (navbar + filter bar + bulk action bar)
- Responsive layout (vertical stacked groups)
- Task details drawer (right-side offcanvas)
-
Real-Time Sync
- Server-Sent Events (SSE) for live updates
- Automatic data refresh when changes occur
- Works across browser tabs
- MCP tool changes reflect instantly in UI
- Auto-reconnection on connection loss (built into EventSource)
-
AI Integration (MCP Server)
- Model Context Protocol server for LLM integration
- Stdio transport for local usage (Claude Code on same machine)
- HTTP transport for remote usage (Claude Code in a VM or on another machine)
- Available tools:
list_groups: Get all task groupslist_projects: Get all projectslist_tasks: Get tasks (optionally by group)get_task: Get a specific taskcreate_task: Create a new taskupdate_task: Update task fieldsstart_timer: Start time trackingstop_timer: Stop time tracking
- Default group resolution: "Inbox" group or first group
- Configurable API base URL via environment variable
- Task deletion intentionally not exposed for safety
-
Data Storage
- Local JSON file (
data/data.json) - Auto-created on first run
- Pretty-printed with 2-space indentation
- Local JSON file (
Prerequisites: Node.js 20+
git clone https://github.com/Zoltanpetrik/napirend.git
cd napirend
npm install
npm run devThe tool is accessible at http://localhost:3030.
Your data is stored in data/data.json (see data/data.example.json for the format).
Environment variables (optional, all have sensible defaults):
| Variable | Default | Description |
|---|---|---|
PORT |
3031 |
Backend server port |
NODE_ENV |
development |
Set to production to serve built client |
NAPIREND_API_BASE |
http://localhost:3031/api |
MCP server's API target |
For production builds, see SPECS.md.
-
New groups added to the top - When creating a new group, place it at the top of the board instead of the bottom.
-
Auto-collapse completed groups - Groups where all tasks are completed should be collapsed by default.
-
Sprint rollover - Option when creating a new group to roll over unfinished work from the previous sprint. Non-pending tasks in the most recent group are marked as completed with "(wip)" appended to their title, estimation set to elapsed time (rounded to .1h), and cloned into the new group with the remaining estimation and description carried over.
-
Exclude unestimated tasks from group progress - Tasks without an estimation should not affect the percentage in the group header. Display should clarify that the percentage is based on estimated tasks only (e.g., "01:30/03:00 (50%) - 4/6 tasks estimated").
-
Pin Inbox below active sprint - Inbox should automatically stay as the second group. When a new sprint is created at the top, Inbox moves to position 2 rather than being pushed further down.
-
Auto-set in progress when starting timer - Starting a timer on a pending task should automatically set its status to in_progress.
NAPIREND includes an MCP server so AI assistants like Claude can manage your tasks. Two transports are available:
Add this to your project's .mcp.json (or global config):
{
"mcpServers": {
"napirend": {
"command": "npx",
"args": ["tsx", "/absolute/path/to/napirend/mcp/index.ts"]
}
}
}The NAPIREND server exposes an HTTP MCP endpoint at /mcp on the same port as the REST API. Configure Claude Code with:
{
"mcpServers": {
"napirend": {
"url": "http://<host-ip>:3031/mcp"
}
}
}Make sure the NAPIREND server is running (npm run dev), then Claude can:
- List and create tasks
- Start/stop timers
- Move tasks between groups
- Update status and projects
| Tool | Description |
|---|---|
list_groups |
Get all task groups |
list_projects |
Get all projects |
list_tasks |
Get tasks (optionally filtered by group) |
get_task |
Get a specific task by ID |
create_task |
Create a new task |
update_task |
Update task fields |
start_timer |
Start time tracking |
stop_timer |
Stop time tracking |
flowchart TB
subgraph Browser
React[React 19 + Vite]
end
subgraph AI[AI Assistant]
LocalClaude[Claude - local]
RemoteClaude[Claude - VM / remote]
end
subgraph MCP[MCP Server - stdio]
MCPServer[mcp/index.ts]
end
subgraph Server[Express 5 :3031]
API[REST API + SSE]
HTTPMCP[HTTP MCP /mcp]
end
subgraph Storage
JSON[(data.json)]
end
React <-->|HTTP| API
API -.->|SSE broadcasts| React
LocalClaude <-->|stdio| MCPServer
MCPServer <-->|HTTP| API
RemoteClaude <-->|HTTP| HTTPMCP
HTTPMCP <-->|internal| API
API <--> JSON
| Layer | Technology | Why |
|---|---|---|
| Frontend | React 19 | Latest and greatest |
| Backend | Express 5 | The one and only |
| Build | Vite | Fast HMR, zero-config TypeScript |
| Styling | Bootstrap 5 | Familiar look and feel |
| DnD | Pragmatic DnD | Atlassian's library: accessible, works reliably |
| Real-time | SSE | Simple, reliable, auto-reconnecting |
| AI | MCP | Turnkey solution for AI assistant integration |
Development started with a handwritten spec, then evolved through collaboration with AI into the following docs:
- SPECS.md: Technical specifications
- SCHEMA.md: Data model and types
- API.md: REST API reference
- UI.md: Interface design notes
- COMPONENTS.md: React component guide
This project is licensed under the MIT License.









