{"id":51148227,"url":"https://github.com/taskbean/taskbean","last_synced_at":"2026-06-26T04:01:07.654Z","repository":{"id":351467441,"uuid":"1210952540","full_name":"taskbean/taskbean","owner":"taskbean","description":"Task management for AI coding agents — and the humans who use them. No cloud, no subscription.","archived":false,"fork":false,"pushed_at":"2026-05-02T06:32:40.000Z","size":56975,"stargazers_count":5,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-02T08:29:06.787Z","etag":null,"topics":["ai","ai-agents","cli","copilot","fastapi","foundry-local","local-first","onnx-runtime","open-source","privacy-first","pwa","task-manager","windows"],"latest_commit_sha":null,"homepage":"https://taskbean.ai","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/taskbean.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-14T23:34:35.000Z","updated_at":"2026-05-02T06:32:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/taskbean/taskbean","commit_stats":null,"previous_names":["taskbean/taskbean"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/taskbean/taskbean","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taskbean%2Ftaskbean","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taskbean%2Ftaskbean/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taskbean%2Ftaskbean/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taskbean%2Ftaskbean/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/taskbean","download_url":"https://codeload.github.com/taskbean/taskbean/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taskbean%2Ftaskbean/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34802385,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-26T02:00:06.560Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","ai-agents","cli","copilot","fastapi","foundry-local","local-first","onnx-runtime","open-source","privacy-first","pwa","task-manager","windows"],"created_at":"2026-06-26T04:00:45.002Z","updated_at":"2026-06-26T04:01:07.641Z","avatar_url":"https://github.com/taskbean.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"app/public/icons/taskbean-wordmark-light.png\" /\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"app/public/icons/taskbean-wordmark.png\" /\u003e\n  \u003cimg alt=\"taskbean\" src=\"app/public/icons/taskbean-wordmark.png\" height=\"80\" /\u003e\n\u003c/picture\u003e\n\n\u003cbr /\u003e\u003cbr /\u003e\n**No cloud. No subscription. No data leaves your machine.**\n\n[![Website](https://img.shields.io/badge/site-taskbean.ai-E8863C)](https://taskbean.ai)\n[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Windows](https://img.shields.io/badge/platform-Windows%2010%2F11-0078D6?logo=windows)](https://www.microsoft.com/windows)\n[![PWA](https://img.shields.io/badge/install-PWA-5A0FC8?logo=pwa)](https://web.dev/progressive-web-apps/)\n[![Foundry Local](https://img.shields.io/badge/AI-Foundry%20Local-742774?logo=microsoft)](https://github.com/microsoft/foundry-local)\n\n\u003c/div\u003e\n\n---\n\n## What is taskbean?\n\nA local-first task manager for developers whose day job involves a coding agent. Two halves, one SQLite file:\n\n| | CLI (`cli/`) | Desktop app (`app/`) |\n|---|---|---|\n| **For** | The agent (Copilot, Claude, Codex, OpenCode) | You |\n| **Does** | Logs tasks as the agent works | Dashboard, chat, reminders, reports |\n| **How** | `bean add \"fix auth bug\"` → `bean done` | PWA with Foundry Local on-device inference |\n| **Tech** | Node.js, commander, SQLite | FastAPI + Express, Foundry Local SDK, vanilla JS PWA |\n\nBoth halves read and write `~/.taskbean/taskbean.db`. The agent does the typing; you do the reviewing. Nothing leaves the machine.\n\n```mermaid\nflowchart LR\n    subgraph Agents[\"Coding agents\"]\n        A1[\"Copilot CLI\"]\n        A2[\"Claude Code\"]\n        A3[\"OpenCode / Codex\"]\n    end\n\n    CLI[\"\u003cb\u003ebean\u003c/b\u003e CLI\u003cbr/\u003e\u003ci\u003eadd · done · report\u003c/i\u003e\"]\n    DB[(\"SQLite\u003cbr/\u003e~/.taskbean/taskbean.db\")]\n    APP[\"Desktop App (PWA)\u003cbr/\u003e\u003ci\u003ebean serve\u003c/i\u003e\"]\n    AI[\"Foundry Local\u003cbr/\u003e\u003ci\u003eoptional · on-device AI\u003c/i\u003e\"]\n\n    A1 \u0026 A2 \u0026 A3 --\u003e|\"Skill auto-logs\"| CLI\n    CLI --\u003e|write| DB\n    DB --\u003e|read| APP\n    APP \u003c--\u003e|\"chat · voice · reminders\"| AI\n```\n\n## Quick start\n\n### CLI (agent skill)\n\n```bash\n# Install globally\nnpm install -g taskbean\n\n# Or via platform binary (checksum-verified against SHA256SUMS on the release)\ncurl -fsSL https://taskbean.ai/install | bash          # macOS / Linux (x64 + arm64)\niwr -useb https://taskbean.ai/install.ps1 | iex        # Windows PowerShell\n\n# Or via winget (Windows)\nwinget install taskbean.taskbean\n\n# Use it\nbean add \"fix auth bug before standup\"\nbean done 1\nbean list\nbean report\nbean chronicle doctor --json  # diagnose local Copilot session data availability\n```\n\n### Updating taskbean\n\n```bash\nbean upgrade              # channel-aware: re-runs npm i -g or re-downloads the binary\nbean upgrade --check      # print latest vs. current, exit without touching anything\nbean upgrade --json       # machine-readable\n```\n\n`bean` prints a one-line notice on stderr (at most once every 24 hours) when a new release is available. It stays silent in CI, non-TTY, and when `TASKBEAN_NO_UPGRADE_NOTICE=1` is set. Cached at `~/.taskbean/.upgrade-check.json`.\n\nPick **one** install channel and stick with it. If you install via both `npm` and the platform binary, you end up with two `bean`s on `PATH` and `bean upgrade` only refreshes the one it was launched from. The install scripts write `~/.taskbean/.install-channel` so `bean upgrade` knows which path to take.\n\n**Recovering from a double install.** `which bean` (POSIX) / `where bean` (Windows) lists every `bean` on `PATH` when you have more than one. Remove whichever you don't want — `npm uninstall -g taskbean` for the npm path, or `rm \"$(command -v bean)\"` for the standalone binary — then re-run `bean upgrade` to bring the remaining one up to date.\n\n### Desktop app\n\n```bash\ncd app\n\n# Python backend (primary)\npip install -r agent/requirements.txt\npython agent/main.py\n\n# Or Node.js backend (legacy)\nnpm install\nnpm start\n\n# Open http://localhost:8275\n```\n\n## Project structure\n\n```\ntaskbean/\n├── cli/                    # Agent-facing CLI tool\n│   ├── bin/taskbean.js     # Entry point (aliased as `bean`)\n│   ├── src/commands/       # CLI commands: add, done, list, report, chronicle...\n│   ├── src/data/           # SQLite store, date parsing, project detection\n│   ├── pwa/                # Minimal dashboard for `bean serve`\n│   ├── scripts/            # Install scripts (curl|bash, PowerShell)\n│   ├── evals/              # Agent skill evaluation scenarios\n│   └── package.json        # npm: \"taskbean\"\n│\n├── app/                    # Human-facing desktop PWA\n│   ├── agent/              # Python backend (FastAPI + Foundry Local)\n│   ├── public/             # Single-file vanilla JS PWA\n│   ├── tests/              # Playwright test suite (21 specs)\n│   ├── server.js           # Node.js backend (Express, legacy)\n│   ├── db.js               # SQLite schema + CRUD\n│   └── package.json        # \"taskbean-app\" (not published to npm)\n│\n├── .agents/skills/taskbean/SKILL.md   # Agent skill manifest\n├── .github/\n│   ├── copilot-instructions.md\n│   └── workflows/release.yml\n├── LICENSE\n└── README.md               # ← you are here\n```\n\n## Works with\n\ntaskbean ships as an [Agent Skill](https://agentskills.io). Drop it in the right folder and the agent picks it up on its next run. `bean install` handles the folder.\n\n```bash\nbean install              # .agents/skills/  (Copilot CLI, OpenCode, Codex)\nbean install --agent auto # detect installed agent CLIs on PATH and install into each\nbean install --global     # same, but in ~/  so every project sees it\nbean install --agent claude                  # .claude/skills/  (Claude Code needs its own folder)\nbean install --agent codex --codex-sandbox   # also whitelists ~/.taskbean in ~/.codex/config.toml\nbean install --agent all                     # install everywhere\n```\n\n| Agent | Skill Discovery | Status | Notes |\n|-------|----------------|--------|-------|\n| **GitHub Copilot CLI** | `.agents/skills/` | ✅ Verified | Full E2E: discovers skill, calls `bean add`/`bean done` |\n| **OpenCode** | `.agents/skills/` | ✅ Verified | Full E2E: discovers skill, calls `bean add`/`bean done` |\n| **OpenAI Codex** | `.agents/skills/` | ✅ Verified | Full E2E: discovers skill, calls `bean add`/`bean done`. Codex's sandbox may block direct edits to project source; use `bean install --agent codex --codex-sandbox` to also whitelist `~/.taskbean` in `~/.codex/config.toml` |\n| **Claude Code** | `.claude/skills/` | ✅ Verified | Needs `.claude/skills/` (does not scan `.agents/skills/`). `bean install` handles this |\n| **Any Agent Skills-compatible agent** | `.agents/skills/` | ✅ Expected | Follows the [Agent Skills spec](https://agentskills.io) |\n\n## How it works\n\n### The CLI is the robot\n\n12 commands (`add`, `done`, `list`, `report`, `track`, `untrack`, `projects`, `install`, `init`, `package`, `serve`, `upgrade`). The agent picks up the skill, notices a task is underway, and calls `bean add`. It closes with `bean done`. You never type any of this. You open the dashboard at the end of the day and there it is: a receipt of what got built.\n\n### The app is the human side\n\nA single-page PWA behind a FastAPI backend (`agent/main.py`). All inference is on-device through [Microsoft Foundry Local](https://github.com/microsoft/foundry-local), which auto-routes to the best silicon on the box: NPU via VitisAI, GPU via MIGraphX or CUDA, CPU as a fallback. Pick a model (Phi-4, Qwen, Llama, anything in the Foundry Local catalog) and switch between them from the settings panel.\n\nChat rides the [AG-UI protocol](https://github.com/ag-ui-protocol/ag-ui) over SSE. Tools like `add_task`, `set_reminder`, and `complete_task` run on the backend while state deltas stream back to the UI, so you watch tasks appear as the model invents them.\n\nWhat's in the box:\n\n- Natural-language task management with multi-turn tool calling 💬\n- Reminders that fire real Windows toasts ⏰\n- Recurring task templates 🔄\n- In-app model switching across the Foundry Local catalog 🧠\n- Voice input 🎤\n- Paste a meeting transcript or drop a PDF; MCP + MarkItDown chew it into tasks 📎\n- Four coffee-themed palettes: Dark Roast, Latte, Espresso, Black Coffee ☕\n- A nerd panel with live OpenTelemetry traces (Events, Metrics, Traces, Logs tabs) plus a bundled [Jaeger v2](http://localhost:16686) waterfall 🤓\n- Multi-agent usage tracking that watches Copilot CLI, Claude Code, Codex, and OpenCode session files on disk and attributes each task to the session that spawned it 📊\n\nOn that last one: only metadata and aggregate token counts are stored. Prompts, tool outputs, and code blocks stay in the agent's own logs where you left them. Toggle agents on and off under **Settings → Agents**.\n\n### Chronicle/session diagnostics\n\n`bean chronicle doctor --json` checks whether local GitHub Copilot Chronicle/session data is discoverable without importing raw prompts, responses, or tool outputs into taskbean. It reports local `~/.copilot/session-state/` and `~/.copilot/session-store.db` availability, expected metadata tables, privacy defaults, and known limitations such as unavailable programmatic `/chronicle` API or unknown remote-sync policy state.\n\n### How updates work\n\nBack the PWA is a service worker. When a new version is deployed, the SW enters a waiting state and the app shows a **\"A new version of taskbean is available\"** toast with **Reload** / **Dismiss**. Reload activates the new SW; Dismiss snoozes the toast until the next update. Long-lived tabs also poll `/api/version` on focus so a backend restart (from `git pull` + `launch.ps1`) triggers the same toast even if the service worker didn't change.\n\n### How the two halves stay honest\n\nSame SQLite file, different lanes. The CLI writes `todos`. The Python backend writes `agent_sessions`, `agent_turns`, and `agent_sources` by tailing each agent's log files forward-only, with rotation detection so a crashed scan never double-counts. When a new session appears within 30 minutes of a fresh task in the same cwd, it backfills `todos.agent_session_id` so every todo can be traced back to the run that created it.\n\n## Storage\n\nEverything lives in one file:\n\n```\n~/.taskbean/taskbean.db\n```\n\nNo cloud sync, no accounts, no phone-home telemetry. Delete the file, taskbean forgets.\n\n## License\n\n[MIT](LICENSE). Free forever.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaskbean%2Ftaskbean","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftaskbean%2Ftaskbean","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaskbean%2Ftaskbean/lists"}