Skip to contentMy Issues, a live board, and a tighter admin surface
New
- My Issues page. Every open issue assigned to you, across every project — with search, six multi-select filters (project, lane, epic, creator, priority, type), and sortable columns.
- Live create and delete. Cards appear and disappear across every open tab as they happen.
- Audited board moves. Reorders are now recorded in the hash-chained audit log.
- Search truncation banner. The UI tells you when a search hit the 500-result cap.
Improved
- Batched board reorders. Multi-card drags fire one UPDATE instead of one per card.
- Live events apply in place. Echo listeners now apply the broadcast payload directly, dropping the extra
GET /issues/{id} every listening client used to fire per event.
- Admin UI is admin-only. Teams, Users, and Roles management are hidden from non-admins.
- Single git-checkout box. Issue pages no longer render a duplicate "open in git" button.
Fixed
- Stripe webhooks fail closed. Returns
403 when STRIPE_WEBHOOK_SECRET is missing; webhook verification is now handled by a kendo-owned middleware.
- MCP
send_feedback error shape. Responses now return a generic error; upstream details are logged server-side only.
VITE_REVERB_HOST example. Corrected the value in .env.example for local dev.
Bigger search results and a status filter for reports
New
- Status filter on
list-reports. The MCP tool accepts status=0|1|2 (Pending / Promoted / Dismissed) and the kendo report list CLI accepts --status pending|promoted|dismissed.
Improved
/search cap raised to 500. The maximum page size on /search went from 100 to 500, and the Board, Backlog, and Issue Overview listing pages now pass limit=500 explicitly — they were silently hitting the endpoint's default of 25 and dropping cards on large projects. The 25-item default is kept for CLI and MCP callers.
MCP attachments, deep-linked reports, and a backend proxy for images
New
fetch_attachment MCP tool. Agents can pull attachment content through MCP with a configurable size limit.
send_feedback MCP tool and kendo feedback send CLI. Submit feedback (title + description) straight from an AI assistant or the terminal.
- Synthesised title in the feedback bubble. The in-app feedback widget auto-fills the title from the authenticated user, so you only have to write the body.
- Deep-linkable reports. Every report now has a copy-link button and a matching
GetReport MCP resource, so you can paste a link into Slack or hand one to an agent.
- Backend proxy for images and attachments. Profile pictures and attachments now serve through backend routes, with a unified error shape across the API.
create_task agent intent. The AI intent union now includes task creation, so assistants can propose new tasks inline.
Improved
- Scoped
/search on Board, Backlog, and Issue Overview. Listings now fetch a scoped page instead of a full project dump. New filters (sprint_status, include_backlog, since) let callers ask for exactly the slice they need.
- Slim
update-board response. Board moves return only the changed positions; the frontend merges them in place, skipping a post-drag refetch.
kendo newbranch assigns and sprints. Creating a branch now also assigns the issue to you and drops it into the active sprint.
- Board and Backlog query params. Board was sending
sprintStatus[]=ACTIVE and returning every recently-updated issue in the project because the tenant http middleware only snake-cases request bodies, not query params. Board now filters by sprint_id; Backlog switched to include_backlog=1 + snake_case keys.
Fixed
- Password reset clears pending invites. Resetting a password now also wipes any pending invite token on the account.
- Orphan notifications on project or team delete. Deleting a project or team now cascades its notifications; they used to linger as unresolvable references.
- Password-reset auth binding. The guard used by the set-password action is now scoped correctly, so the right authentication context is always applied.
Stripe billing, tighter AI errors, and an AI-bot cleanup
New
- Stripe billing, end to end. Subscriptions, signature-verified Stripe webhooks, tenant billing pages (status / checkout / portal, gated behind
manage-billing for admins), and a central-side admin surface (grant / revoke / cancel). Currency: EUR.
- Free-tier limits enforced. Inviting a fourth seat, creating a second project, or restoring a soft-deleted user past the 3-seat cap now returns
402 Payment Required. After a downgrade, issue creation in "excess" projects (everything past the single free project, oldest kept) is blocked with 403 Forbidden.
- User-facing AI error messages. AI errors now return the right HTTP status: rate-limited →
429, provider overloaded → 503, request too large → 422, generic AI error → 502. Previously everything came through as a generic 500.
Improved
- Unified select component across forms. Delete-role, pagination, epic, and AI-key forms now use the design-system single-select, replacing the old native-
<select> wrapper.
- My Issues badge refreshes on self-assign. Assigning yourself from an issue detail page immediately updates the sidebar badge — previously it waited until you navigated to My Issues.
- Profile issue counter matches My Issues. The profile sidebar now excludes Done-lane issues, so the count stays consistent with the My Issues overview.
- AI agent/bot assignment removed. The entire surface is gone — no more bot-assignable user, AI-run tables, or
is_bot flag.
- Hardened audit log writes. Audit-log writes now require a live database transaction and fail loudly without one.
Fixed
- OAuth invite with an already-linked provider. Completing an invite with a provider already linked to another account used to throw a unique-constraint exception from the database; it now returns a
provider_already_linked error cleanly, for both invite and link flows.