{"slug": "show-hn-opentracker-an-open-source-pivotal-tracker", "title": "Show HN: Opentracker, an open source Pivotal Tracker", "summary": "Usero released Opentracker, an open-source replacement for Pivotal Tracker, which Broadcom shut down in April 2025. Opentracker runs on Cloudflare Workers with a D1 database and includes an MCP server exposing tools such as list_projects, list_stories, get_story, create_story, update_story, add_comment and list_labels, plus a REST API. The project is MIT-licensed, hosted at tracker.usero.io, and its developer notes it is early, with one daily user and rough edges around multi-user projects.", "body_md": "Open source Pivotal Tracker.\n\nBroadcom shut Pivotal Tracker down in April 2025. This is the same board: icebox, backlog, current iteration, done. Stories are 1, 2, 4 or 8 points, iterations fill to your velocity, and a story goes started, finished, delivered, then accepted or rejected.\n\nRuns on Cloudflare Workers with a D1 database, free tier is enough. Hosted version at\n[tracker.usero.io](https://tracker.usero.io).\n\nIt also has an MCP server.\n\nSign in, open `/profile`, create an API key (` lt_...`, shown once, one per machine or agent), then:\n\n```\nclaude mcp add --transport http tracker https://your-tracker.example.com/mcp --header \"Authorization: Bearer lt_...\"\n```\n\nAny MCP client that speaks streamable HTTP works the same way (Cursor, OpenCode). The tools are `list_projects`, `list_stories`,\n`get_story`, `create_story`, `update_story`, `add_comment` and `list_labels`. `update_story` handles the state changes: `started`\nwhen the agent begins, `finished` when the work is done, and the agent leaves its notes and PR links with `add_comment`.\nDelivered, accepted and rejected are the review steps a human usually takes on the board. Details, transport and the env var\nconfig in [docs/mcp.md](/usero-feedback/opentracker/blob/main/docs/mcp.md).\n\nA REST API is also available, see `API.md`.\n\n```\nnpm ci\ncp .dev.vars.example .dev.vars   # set SESSION_SECRET; everything else is optional\nnpx wrangler d1 migrations apply leantracker --local\nnpm run dev\n```\n\nThe dev server is at [http://localhost:5173](http://localhost:5173). Sign up there, create a project and an API key, and point the `claude mcp add` line\nabove at `http://localhost:5173/mcp`.\n\n`npm run dev:tunnel` is the same server behind a named cloudflared tunnel (used for the hosted dev instance).\n\n```\nnpx wrangler d1 create leantracker\n# paste the database_id into wrangler.jsonc (d1_databases) and set routes to your domain, or delete routes to use workers.dev\nnpx wrangler d1 migrations apply leantracker --remote\nnpx wrangler secret put SESSION_SECRET\nnpm run deploy\n```\n\nOptional secrets (`wrangler secret put`): `SES_AWS_ACCESS_KEY_ID` and `SES_AWS_SECRET_ACCESS_KEY` for email, `SENTRY_DSN`,\n`GOOGLE_ANALYTICS_API_SECRET`. Optional vars in `wrangler.jsonc`: `DASHBOARD_URL`, `GOOGLE_ANALYTICS_ID`, `EMAIL_FROM`,\n`ADMIN_EMAIL`, `USERO_CLIENT_ID` (set to `\"\"` to hide the feedback widget).\n\nEmail is only used for admin notifications (new signups and the like, sent to `ADMIN_EMAIL`). Leave the SES keys unset and it logs\ninstead of sending.\n\nEdit `prisma/schema.prisma`, then:\n\n```\nnpx wrangler d1 migrations create leantracker <name>\nnpx prisma migrate diff --from-local-d1 --to-schema-datamodel ./prisma/schema.prisma --script --output migrations/<NNNN_name>.sql\nnpx wrangler d1 migrations apply leantracker --local\nnpx prisma generate\n```\n\nThe CI workflow applies migrations to the remote database on push to `main`. By hand:\n\n```\nnpx wrangler d1 migrations apply leantracker --remote\n```\n\n`npm run cf-typegen` regenerates the binding types after changing `wrangler.jsonc`.\n\nEarly. One person uses it daily, so the paths I hit are solid and the ones I don't are less so. Expect rough edges around multi-user projects and anything I have not needed yet. Issues and PRs welcome, small ones especially.\n\nopentracker is built by [Usero](https://usero.io), the user feedback tool. The feedback widget in the corner of the hosted version\nis ours. Set `USERO_CLIENT_ID=\"\"` to hide it in your own deployment.\n\nMIT, see `LICENSE`.", "url": "https://wpnews.pro/news/show-hn-opentracker-an-open-source-pivotal-tracker", "canonical_source": "https://github.com/usero-feedback/opentracker", "published_at": "2026-09-12 20:30:26+00:00", "updated_at": "2026-09-12 20:55:17.310141+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "ai-products"], "entities": ["Usero", "Opentracker", "Pivotal Tracker", "Broadcom", "Cloudflare Workers", "Cloudflare D1", "Claude", "Cursor"], "alternates": {"html": "https://wpnews.pro/news/show-hn-opentracker-an-open-source-pivotal-tracker", "markdown": "https://wpnews.pro/news/show-hn-opentracker-an-open-source-pivotal-tracker.md", "text": "https://wpnews.pro/news/show-hn-opentracker-an-open-source-pivotal-tracker.txt", "jsonld": "https://wpnews.pro/news/show-hn-opentracker-an-open-source-pivotal-tracker.jsonld"}}