Claude Code Tools

bun-do

official

Local-first todo app for humans and AI agents — REST API, MCP server, Claude/OpenClaw skill. Bun + Alpine.js.

Version
1.4.0
Last Updated
2026-02-18
Source
official

bun-do

A fast, local-first todo app built on Bun. One TypeScript file, one HTML file, zero runtime dependencies. Built to be used and controlled by AI agents.

Bun TypeScript Alpine.js License npm

bun-do screenshot

Why bun-do?

Most todo apps want you to sign up, sync to the cloud, or install an Electron app. bun-do is different:

  • Single-file serverserver.ts serves both the API and frontend
  • JSON storage — tasks and projects live in plain .json files you can version, grep, or edit by hand
  • No build step — Alpine.js + SortableJS vendored locally, works offline
  • Self-hosted — runs on localhost, your data never leaves your machine
  • AI-native — ships with an MCP server and installable skill for Claude Code and OpenClaw

Features

Views — All / Year / Month / Day / Backlog / Payments / Projects

Tasks

  • Priorities P0 (critical) through P3 (backlog), with optional Eisenhower matrix labels
  • Types: task, deadline, reminder, payment
  • Recurring: weekly, monthly, yearly with auto-creation on completion
  • Overdue tasks auto-carry to today (payments keep their original due date)
  • Inline click-to-edit for titles, notes, and subtask names
  • Undo delete with 10-second recovery window

Payments — Dedicated bill/payment tracker with optional amounts, grouped by month with per-month subtotals

Subtasks — Per-task checklists with drag-and-drop reorder

Projects — Lightweight project tracker with timestamped progress log entries

UX

  • Keyboard shortcuts: n new task, 15 switch views, / search, Esc dismiss
  • Live search across task titles and notes
  • Overdue count badge
  • Adjustable font size (A-/A+)
  • Error toasts on failed API calls
  • Light / dark theme

Quick start (npm)

bun install -g bun-do
bun-do          # start server + print URL
bun-do open     # start server + open in browser

Data is stored in ~/.bun-do.

Service manager commands

bun-do start     # start background server (default)
bun-do stop      # stop background server
bun-do restart   # restart background server
bun-do status    # check running state
bun-do open      # start + open in browser
bun-do --version # print version

Custom port:

bun-do start --port=9000

Run without installing

bunx bun-do

Quick start (source)

git clone https://github.com/ricardofrantz/bun-do.git
cd bun-do
bun install
bun run dev     # hot reload on :8000

Or without hot reload:

bun run start   # plain server on :8000

Background service (source clone)

./bin/bun-do              # start
./bin/bun-do status       # check
./bin/bun-do stop         # stop
./bin/bun-do restart      # restart
./bin/bun-do restart --example  # restart and reload data/tasks.example.json

macOS native app (optional)

bun-do app   # compiles on first run, then opens a native macOS window

Uses a lightweight Swift WKWebView — no Electron, no browser chrome. Requires Xcode command line tools (xcode-select --install). The compiled binary is cached in ~/.bun-do/app/.

LLM Integration

bun-do is designed to be your AI agent’s task layer. It ships with two integration paths so any LLM stack can read, add, edit, and delete your tasks.

OpenClaw is a local-first personal AI assistant that routes your conversations from WhatsApp, Telegram, Slack, Discord, and more to Claude or any LLM — all running on your own machine.

bun-do + OpenClaw = text your AI from anywhere and manage your tasks without leaving your messages.

You (WhatsApp) → "add P1 task: fix the deployment, due tomorrow"
OpenClaw → bun-do skill → POST /api/tasks
OpenClaw → "Done. Task added for Feb 19."

Install the skill for OpenClaw:

bun-do install-skill --openclaw
# copies to ~/.openclaw/workspace/skills/bun-do-api/SKILL.md

Restart OpenClaw to activate.

Claude Code / Claude Desktop

bun-do install-skill
# copies to ~/.claude/skills/bun-do-api/SKILL.md

Restart Claude Code or start a new session. Claude can now add, edit, and list tasks directly via the REST API using curl.

MCP server (any MCP client)

bun-do-mcp is a stdio MCP server exposing 6 tools: list_tasks, add_task, update_task, delete_task, list_projects, add_project_entry.

Add to .mcp.json or claude_desktop_config.json:

{
  "mcpServers": {
    "bun-do": { "command": "bun-do-mcp" }
  }
}

Custom port: "env": { "BUNDO_PORT": "9000" }. Run bun-do start first.

Configuration

VariableDefaultDescription
BUNDO_DATA_DIR./data (source) / ~/.bun-do (npm)Directory for JSON data files

To use a custom data directory:

export BUNDO_DATA_DIR=~/my-tasks
bun-do restart

Data

All data is plain JSON in BUNDO_DATA_DIR:

data/
  tasks.json            # your tasks
  projects.json         # your projects
  tasks.example.json    # seed data (committed to repo)

On first run, tasks.example.json seeds tasks.json if it doesn’t exist.

API

MethodEndpointDescription
GET/api/tasksList tasks (auto-carries overdue to today)
POST/api/tasksCreate task
PUT/api/tasks/:idUpdate task
DELETE/api/tasks/:idDelete task
POST/api/tasks/reorderPersist backlog order
POST/api/tasks/clear-doneRemove completed tasks
POST/api/tasks/:id/subtasksAdd subtask
PUT/api/tasks/:id/subtasks/:sidUpdate subtask
DELETE/api/tasks/:id/subtasks/:sidDelete subtask
POST/api/tasks/:id/subtasks/reorderReorder subtasks
GET/api/projectsList projects
POST/api/projectsCreate project
PUT/api/projects/:idUpdate project
DELETE/api/projects/:idDelete project
POST/api/projects/:id/entriesAdd log entry
DELETE/api/projects/:id/entries/:eidDelete log entry

Stack

LayerTech
RuntimeBun
ServerBun.serve() — zero-dependency HTTP
FrontendAlpine.js + SortableJS (vendored)
StorageFlat JSON files

License

BSD-3-Clause