Project tracking for software teams: stories, epics and iterations with a board and a burndown, built to sit close to a git workflow.
Build me an issue tracker that replaces Shortcut — and know what makes this ALMOST. The tracker is a fortnight. The feature that earns the subscription is **git integration that closes stories**: a branch named from a story, a pull request that moves it to review, a merge that finishes it. Nobody updates a tracker by hand for long, and that automation is the difference between a record that is current and one that is fiction. STACK - Node 20+ with Fastify, server-rendered HTML with a little vanilla JS - SQLite through better-sqlite3, WAL mode, with FTS5 - Caddy in front THE DATA MODEL - teams, projects, epics, milestones — a shallow hierarchy, fixed - stories: id, team_id, number, kind, title, description_md, state_id, owner_ids_json, requester_id, estimate, epic_id, iteration_id, position, created_at, started_at, completed_at - states: id, team_id, name, type, position — the type is unstarted, started or done, and every report depends on it. Custom names, fixed types - iterations: id, team_id, name, starts_on, ends_on; iteration_stories with added_at and removed_at, so scope change is visible - story_history: id, story_id, field, old, new, actor_id, at — append-only, and the basis of every metric. It cannot be reconstructed later - branches: id, story_id, name, repo, created_at; pull_requests: id, story_id, repo, number, state, merged_at, url - comments, attachments, labels, relations, subscribers - Story numbers per team, allocated in the creating transaction and never reused. That identifier goes into branch names and commit messages and lives forever THE GIT INTEGRATION, WHICH IS THE PRODUCT - A branch name generated from the story — number plus a slug — copied with one keystroke. That single convention is what makes everything else automatic - A webhook from the forge, signature verified, idempotent by delivery id - A branch created with that name links to the story and moves it to started - A pull request referencing it moves the story to review and records its state and URL - A merge to the default branch moves the story to done, once, and never again if the event is redelivered - Configurable per team: which forge state maps to which story state. That mapping is written once and deliberately, because 'in review' and 'ready to test' mean different things to different teams - Read the forge's events; never write to the repository. A tracker that pushes commits is a tracker nobody will connect - Show every branch and pull request on the story, with its state, so the question 'what changed for this' is answered from the story itself WORKFLOW - Kinds: feature, bug, chore. Three, and they are enough - Estimates as a single scale per team, numeric - Iterations with a burndown computed from story_history at query time, with scope added mid-iteration shown as its own line. A burndown that hides added work is a burndown that lies - Epics spanning iterations, with progress computed from their stories - A story not started and not finished by the end of an iteration is carried explicitly and the carry recorded — one carried three times is telling you something VIEWS - Board grouped by state, a list, and a table, all from one query builder with three renderers - Filters saved as views, shareable by URL, permissions checked inside the query - Ordering by fractional positions rather than floats, or stories will swap places after enough drags - Keyboard for everything: create, assign, change state, comment, search THE REST - Search with FTS5 across titles, descriptions and comments - Notifications batched into a digest with mentions immediate — an over-notifying tracker gets filtered into a folder nobody opens - Cycle time and lead time computed from the history: the numbers a team can actually act on, far more than velocity - Export everything as JSON in one command OPERATIONS - .env: DATABASE_PATH, STORAGE_PATH, BASE_URL, SESSION_SECRET, OIDC_*, SMTP_URL, FORGE_WEBHOOK_SECRET - Migrations on boot, each once; nightly backup off the machine - Health endpoint reporting webhook lag WHAT MATTERS MOST The branch convention and idempotent webhooks. Get a merge to close a story exactly once, and the tracker stays true without anybody maintaining it — which is the only way a tracker ever stays true.
What you lose
- Branch and pull-request integration that moves a story without anyone updating it
- Iteration reports and burndown charts a team already understands
- Cross-team epics and a roadmap view above the day-to-day board
If you would rather not build
- GitHub Projects, free and already integrated
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| Team | $8.50/mo | — | 15 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Plane
$0Open-source project tracking with cycles, modules and a roadmap.
makeplane/planefree · open source
Vikunja
$0A self-hosted task tracker with lists, boards and a Gantt view.
go-vikunja/vikunjafree · open source
Why this verdict
our own opinion · changed only by a person
58/100
Verdict kinda at 58. The board is a weekend; the git integration is the good part and the reporting is where the second weekend goes.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Shortcut
answered from the record above
Is Shortcut free?
No — the plan we track is $8.50 a month. Team at $8.50 per user per month billed monthly, around $8 annually; a free tier covers small teams.
Can you replace Shortcut by building your own?
ALMOST. A weekend of work, and real gaps remain. Replacement score 58 out of 100, build time a weekend. Read what you lose before you decide.
How much does Shortcut cost?
$8.50 a month on Team — $102 a year. Recorded 10 Aug 2026.
What do you lose by replacing Shortcut?
Branch and pull-request integration that moves a story without anyone updating it; Iteration reports and burndown charts a team already understands; Cross-team epics and a roadmap view above the day-to-day board. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Shortcut?
Yes: Plane, Vikunja. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

