Skip to content

Changelog

What's new in kendo, in reverse chronological order.

My 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.