Skip to content

Changelog

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

Pinned projects, error triage, and forms that keep your input

New

  • Pin favorite projects. Pin the projects you work in most to a dedicated Pinned section at the top of the sidebar, always one click away. A pinned project moves out of its team group so it sits in exactly one place, and unpinning drops it back where it was.
  • Collapse sidebar project groups. Collapse or expand any group in the project sidebar — Pinned, your teams, or direct memberships — from its header, and each group remembers whether you left it open or closed.
  • Give each project an avatar. Upload an avatar for a project in its settings, and it shows next to the project in the list. The project list is now sorted alphabetically too.
  • Resolve, ignore, and reopen error groups. Error groups now have a status you can set — resolve one you've handled or ignore the noise — and a resolved error that happens again automatically reopens itself.
  • Turn an error into a Bug issue. From an error group you can now create a Bug issue in one step, and the error and the new issue stay linked in both directions.
  • Watch a project's errors. Turn on error watching for a project to get an inbox notification whenever a new kind of error first appears, plus an email alert that's on by default and editable from your notification settings.
  • Download all of an issue's attachments. A Download all control zips every attachment on an issue into a single download.
  • Filter the time log to your own entries. The time log gains a "My entries" quick-filter that narrows the list to just the time you logged.
  • Copy an issue key from the board. Hover any board card to reveal a copy button on its issue key — the same gesture the issue page already had.
  • Docs link in the sidebar. A new Docs link under What's New jumps straight to the product documentation.

Improved

  • Newest notifications first. Your notifications inbox now opens with the newest at the top and remembers whichever sort order you pick.
  • Time entries read newest-first. The time entries in an issue's side panel are ordered newest-first, matching the rest of the app.
  • Overflowing attachments wrap into view. When an issue has more attachment thumbnails than fit on one row, they now wrap onto additional rows instead of scrolling off-screen, and the section header shows a count.
  • Double-clicks can't fire an action twice. Action buttons across the app — from issues, comments, sprints, and reports to settings and workspace admin — now lock after the first click, so a fast double-click or a slow connection can't run the same change twice.

Fixed

  • Forms keep what you typed. When a submission fails validation, the form no longer clears — your input stays put with the errors shown inline, across the app's forms.
  • Reports you promote update right away. Promoting a report now updates your own view immediately, instead of leaving it marked Pending until you refreshed.
  • Notification toggles no longer snap back. Flipping several notification settings in quick succession no longer silently reverts the first one you changed.
  • New profile pictures appear immediately. After you upload an avatar, the new image now shows straight away without needing a hard refresh.
  • Unlink a branch without connecting GitHub. The Remove button on a linked branch now appears even when GitHub isn't connected — unlinking is a kendo-side action that never needed GitHub.
  • Links in issue content open in a new tab. Links in descriptions and comments now open in a new tab, so following one no longer unloads the app or risks logging you out when you navigate back.
  • No stray error when signing in. Opening a protected link while signed out now takes you straight to the sign-in page, without first flashing an "Unauthenticated" error.

Multi-workspace CLI, double-submit guards, and a tidier backlog

New

  • Multiple workspaces from the CLI. The kendo CLI now holds a separate login per workspace, switches between them with kendo auth switch, and lets you target one per command with --tenant or the KENDO_TENANT variable — no config editing needed. After updating, existing CLI users sign in once; switching between logged-in workspaces after that needs no re-auth.
  • Read an issue's comments from the CLI. A new kendo issue comments <ref> command prints the full comment thread with author names, or raw JSON with --json.
  • Point an issue at a specific GitHub repo. On projects connected to two or more GitHub repositories, the issue form gains a Target GitHub repo picker — and starting work or linking a branch then targets that repo automatically.
  • Promoted reports show up on the issue. When a report is promoted into an issue, it now appears in a Report(s) section on that issue, each entry linking back to the original report.

Improved

  • No more accidental double-submits. Forms and modals across both the workspace and admin apps now lock after the first click, so a double-click or a slow connection can't submit the same form twice.
  • The backlog lines up. Issue rows now sit in aligned columns with each issue's priority shown, regardless of title length — and you can assign an issue to yourself in one click, the same quick self-assign the board already had.
  • Automated changes stand out in activity. When an automated event moves an issue — such as a GitHub branch or pull request — the activity feed now marks it as "System" with a distinct icon, so you can tell automated changes from ones a teammate made.
  • A heads-up when a change is too big to stream live. If a bulk update is too large to push to your screen in real time, the board, backlog, and overview now show a persistent notice with a Refresh button instead of silently leaving you on stale data.
  • Find reports by their number. Reports now show their id in the list and detail views, and you can search the report queue by that number.

Fixed

  • The app reliably loads after an update. Previously a page left open across a deploy could fail to load until you manually refreshed; the app now always fetches the current version, and tabs open across an update recover on their own.
  • Resend reaches the right workspace. Resending a workspace verification email now reliably matches the correct workspace, even when its address differs from its internal name.

Tooltips everywhere, dedicated epic pages, and richer editing

New

  • Epics open as a page. Viewing an epic now takes you to its own page instead of a cramped modal, with its linked issues listed inline.
  • Delete an issue. The issue page gains a delete button next to edit, with a confirmation step that names the issue first.
  • Links, quotes, and code blocks in the editor. The formatting toolbar adds a link button — with an inline panel to type the URL — plus blockquote and code-block buttons, in issue descriptions and comments.
  • Tenant status at a glance. The tenants console gains a Status column showing whether each workspace is healthy, unverified, overdue on payment, cancelled, setting up its custom domain, or stuck on a domain error — so you can triage without opening each one.
  • Migrate Jira attachments from the CLI. A new kendo migrate jira-attach command streams a single attachment straight from a Jira URL onto a kendo issue.

Improved

  • Hover hints on icon buttons. Icon-only buttons across the app now show a label on hover or keyboard focus, and user avatars reveal the person's full name — clearer for everyone and properly announced to screen readers. Collapsed sidebar items show their project name too.
  • Pick blockers from your whole backlog. The Blocks / Blocked By picker now searches your backlog instead of loading every issue in the project, so it opens faster on large projects — and a dependency that has since moved into a completed sprint still shows up.
  • Clear the filter search in one click. The filter bar's search field gains an inline ✕ to reset it.
  • Heads-up before two-factor revokes your tokens. Turning on two-factor authentication — or enforcing it on a role — now tells you how many personal access tokens it will revoke and asks you to confirm first.

Fixed

  • The CLI --project flag now works. Passing --project <CODE> now resolves to the right project for that one command — previously it was ignored and every command returned a not-found error. Codes match regardless of letter case, and the override is never saved to your configuration.
  • Clear error when a CLI or extension token expires. A revoked or expired access token used by the CLI, VS Code extension, or feedback balloon now returns a clear 401 error.
  • More reliable workspace-address availability. Picking a workspace name now accounts for every reserved address, so the available/taken result is accurate before you sign up.

Toolbar image uploads, rich epic descriptions, and post-release recovery

New

  • Insert images from the toolbar. Issue descriptions, new comments, and comment edits gain an insert-image button in the formatting toolbar — pasting a screenshot still works, but there is now a dedicated button for it too.
  • Formatted epic descriptions. Epic descriptions now use the same rich-text editor as issues, so bold, italic, headings, and lists work there too.
  • Sprints over MCP. AI agents and MCP integrations can list a project's sprints with the new read-only get-sprints tool, filtering by status (Planned, Active, or Completed) or looking up a single sprint by ID. prepare-project-context now returns all Planned and Active sprints in one call, not just the active one.

Improved

  • AI story generation runs in the background. Generating a user story no longer cuts off when it runs long — the request returns immediately, progress steps update as they complete, and the result appears when it's ready. A failure now shows an error message instead of nothing.
  • Less refetching inside a project. Sprint, epic, and label lists are now cached and only re-downloaded when something actually changed, so switching between project tabs stops re-requesting the same data.
  • Clearer Git panel without a connection. When your personal GitHub account isn't connected, an issue's Git panel now says so and links to your Profile page to set it up, with the branch-name auto-link hint kept as an alternative.
  • Verified GitHub installation linking. Connecting a GitHub App installation to your workspace now confirms you own the GitHub account — or are an admin of the organization — before the link is made. Organization connections may ask you to reconnect GitHub once to grant organization-read access, and a network hiccup during setup now shows a clear error page asking you to try again.

Fixed

  • Open tabs recover after a release. Clicking a link in a tab that stayed open across a kendo update could show a blank pane; the app now detects the outdated build and reloads straight to the page you were heading for.
  • Errors no longer stick to the page. A failed action — like a comment that didn't submit — used to flip the whole page to "Could not load page." and keep it there as you navigated; failures now surface as a normal error message and the next page loads with a clean slate.
  • Epic board stays live. Moves made by teammates now apply on the epic board as they happen, and the open/closed indicator no longer goes stale.

Error tracking, scoped project tokens, and a workspace finder

New

  • Error tracking. Kendo can now collect the runtime errors your app reports and group repeated ones together, so each distinct problem shows once with its stack trace, environments, occurrence count, and first- and last-seen times. Every project gains an Errors tab, and a new Error tracking page in the sidebar surveys error groups across all your projects, filterable by project and environment; opening a group shows a detail view that dims framework frames so your own code stands out, with copy-link and copy-stack-trace buttons.
  • Scoped project tokens. When you create a project token in the Settings tab you now pick its ability — Reports or Error tracking — and the token list shows each token's ability. An Error tracking token is what lets your app post errors to the project's error-events endpoint.
  • Error groups over MCP. A new read-only MCP tool returns your error groups across every accessible project, or scoped to one project or environment, with an optional recent-days window; stack traces are left out unless you ask for them.
  • Find your workspace. A new finder at central.kendo.dev/sign-in takes your workspace subdomain and routes you to the right login when you don't remember the URL, and the kendo.dev landing page now links straight to it and to self-serve signup.

Improved

  • More features on by default. Error tracking, project tokens, AI-assisted user stories, bring-your-own AI keys, and the in-app report tool are now on by default for every workspace.
  • Resend cooldown starts on load. On the post-signup screen the resend-verification button is now disabled from the moment the page opens and re-enables after 60 seconds, so it can't be tapped before the email has a chance to arrive.

Pinned comments, label filters, and board refinements

New

  • Pinned comments. Pin one comment to the top of an issue so the key note stays above the thread, set apart with a highlighted treatment. Pinning needs issue-edit permission.
  • Filter by label. The board, backlog, and project issues view gain a Label filter — narrow to issues carrying any of the labels you pick, alongside the existing filters.
  • Labels over MCP. Five new MCP tools to list, create, update, delete, and set issue labels. The project- and issue-context tools return full label details; the search and my-issues tools return label IDs, with a new label filter on search.

Improved

  • Time at a glance. Board cards and backlog rows now show logged-versus-estimated time, so you can spot what's nearly done without opening each issue.
  • Board scrolls on narrow screens. Between tablet and laptop widths the board scrolls sideways with lanes holding a readable minimum width, instead of squeezing every lane to fit.
  • Epic timeline opens on today. The timeline now lands with today near the left edge, putting current and upcoming work in view first.
  • Post comments from the keyboard. Cmd/Ctrl+Enter submits a comment; plain Enter still adds a newline.
  • Unsaved comment guard. Leaving an issue with a half-written comment now prompts before discarding it.
  • Markdown previews. Markdown attachments now render inline in the attachment preview, alongside images and PDFs.
  • Faster past-date time logging. Today, Yesterday, −2d, and −3d presets under "Started At" set a recent date in one click.
  • Clearer permission messages. Hitting a permission wall now returns a message explaining you lack permission and an administrator can grant it, instead of a generic "unauthorized."

Fixed

  • Stuck card drags. Dragging a card to certain spots could fail permanently with no usable error; drops now recover on their own and surface the real reason when they can't.
  • Time summaries follow the work date. Back-dated time entries now count toward the day the work happened, matching the table, instead of the day they were logged.
  • Mention menu placement. The @-mention menu no longer flashes in the far corner on the first @, and stays anchored to your cursor as you scroll.
  • Live status after agent edits. When an issue is moved through MCP or an agent, the My Issues view now updates to the new lane's title and colour live, instead of showing the old one until a manual refresh.
  • Epic bar colours. The epic bar-colour picker now lists colours by name, fixing hues that appeared to shift or swap when selected.
  • Editor links. Links inside the comment and description editor are underlined and no longer navigate away when you click to edit them.
  • Safari row clicks. Clicking a table row now works in Safari instead of the link overlaying the whole page.
  • Honest signup status. The post-signup screen now shows that workspace setup is still in progress; a verification link arrives once your workspace is ready.
  • Deleting handed-off issues. Deleting an issue now clears its Hand-to-Claude data cleanly, and an issue is protected from deletion while a Claude session is still running.

Project labels, automatic epic status, and board polish

New

  • Project labels. Create, rename, recolour, and delete labels in project settings, then apply them to issues from the issue sidebar or board cards. Labels show as coloured chips, update live for everyone viewing the project, and are included in the API and MCP issue payloads.
  • Bulk-move backlog issues. Select several issues in the Backlog and move them to another sprint in one action — by dragging the selection or using the Move-to dropdown. Previously a multi-select drag saved only the issue you dragged.
  • Attachment arrow-key navigation. Page through an issue's attachments with the left and right arrow keys in the preview modal.

Improved

  • Epics track their issues. An epic's status is now derived automatically — closed only when all of its issues reach the last lane, open otherwise. The manual status selector is gone, and reordering lanes in a way that changes which lane is last now warns you first.
  • Live project updates. Changes to a project's name or other details now appear instantly for everyone viewing it, without a refresh.
  • Sidebar gives content more room. The navigation sidebar auto-collapses on narrower screens; you can still expand it for the rest of your session.
  • Easier to tap and read. Form controls meet a comfortable minimum size on touch devices, file-upload dropzones are larger, and avatar initials are larger and higher-contrast.
  • Keyboard-friendly rich-text editor. Tab now moves past the formatting toolbar in one step to reach the editor; arrow keys move between the formatting buttons.

Fixed

  • Markdown tables render properly. Tables in issue descriptions and comments now display with borders, headers, and cell padding instead of appearing as an unstyled block.
  • Accurate complete-sprint count. The complete-sprint prompt could show an outdated number of unfinished issues; it now reflects the current state of the board when you open it.
  • Deleting a project now succeeds. Projects could fail to delete with a server error when they had related activity — Claude sessions, issue watchers, attachment data, or linked AI keys. Deletion now clears these up first.
  • Modals stay on screen. Wide modals could spill past the edge on large screens; they're now kept within the viewport.

Live attachment updates and paginated comment threads

Improved

  • Live attachment updates. When someone uploads, replaces, or deletes an attachment on an issue you have open, the attachment grid updates instantly for everyone viewing it — no refresh needed, bulk deletions included.
  • Paginated comment threads. Long comment threads now split into pages of 25, newest first, with a page bar to step through older comments instead of rendering the whole history at once. New comments you or teammates post appear on the first page.

Fixed

  • Corrupt images are caught on upload. An image that can't be decoded is now rejected with a clear error at upload time.

Multi-repo branch picker, sidebar redesign, and report watchers

Multi-repo project support lands across the branch picker, MCP tools, and the issue API; the issue sidebar gets a collapsible-bands refresh; and project owners are now notified when new reports come in.

New

  • Multi-repo branch picker on the issue sidebar. When a project has more than one GitHub repo linked, the branch picker now lists every linked repo's branches in one grouped picker, disambiguated by repo. Per-repo fetch failures surface as inline retry rows that don't block the healthy repos. The create-branch flow gets a repo dropdown that remembers your last pick per project.
  • Collapsible issue sidebar. Details, Planning, Git, and Time are now collapsible bands that show a digest summary when closed (e.g. "Alice · In Progress" for Details). Open/closed state is remembered per section across visits.
  • Notifications when new reports land. Project owners now auto-watch their projects and receive an in-app and email notification whenever a teammate, the API, or an MCP tool files a new report. A bell toggle on the project's reports overview opts you in or out per project, and a new email-preference row in user settings controls the email channel. Owners on existing projects are watched retroactively. Anonymous reports show as New report "<title>" by <author> in the feed.
  • MCP unlink-branch tool. Mirror of link-branch. Identifies the link by issue + branch name, with an optional repo_full_name hint for multi-repo projects; refuses to delete when the hint contradicts reality and lists the actual candidates.
  • MCP link-branch and start-work-on-issue accept a repo_id hint. Multi-repo projects previously returned a candidate-listing error that agents had no parameter to act on. The optional repo_id closes that gap — agents can look up repo IDs via the project's GitHub-repos resource (kendo://projects/{id}/github-repos) and retry without human escalation.

Improved

  • Lane shown as a coloured badge on backlog rows. The plain-text lane on backlog list items is now a coloured badge that picks up the lane's existing colour — matching the chip already used on the board and on the issue detail page.
  • Active sprint label on the Issues and Backlog tabs. The "Sprint: NAME" header that the Board already showed now appears on the Issues and Backlog filter bars as well, so the active sprint context is visible from every project tab.
  • Hand-to-Claude is explicitly disabled on multi-repo projects. The button now carries an explanatory tooltip — "Multi-repo projects can't yet be handed to Claude" — instead of silently showing a disabled button with no explanation. Zero-repo projects show a separate tooltip. The legacy "Set primary repo" control has been removed from project GitHub settings.
  • branch_links on issue resources. Issue API responses, realtime broadcasts, and the MCP get-issue resource now carry a structured branch_links array with per-link id, branch_name, repo_full_name, and status, replacing the previous flat branch_link_statuses enum array. API and MCP consumers will see the new shape on board, list, detail, and broadcast paths.

Fixed

  • Clearing one filter no longer hides another active filter. When two filter chips were active in the project filter bar and you cleared the most-recently-edited one from its value popover, the remaining still-active chip disappeared from the bar too. The bar now falls back to the first active filter so the surviving selection stays visible.
  • Filter selections no longer bleed across projects. Assignee, lane, sprint, epic, and creator filters used to share a single storage slot, so navigating from Project A to Project B would carry A's selections to B — and strict ID equality then blanked out the issue list. Each project (and the My Issues page) now owns its own filter slot.
  • Hand-to-Claude pill shows the running state. Sessions used to sit on "Claude is picking up the issue…" until they finished, then jump straight to Completed or Failed. The "Claude is working on the issue…" pill now appears as soon as the session actually starts work, on the issue's Hand-to-Claude tab.
  • Pagination controls stay on one row. Page chevrons and the current-page indicator no longer wrap to a second line in narrow embedded surfaces. On touch, the page indicator now renders as a styled button alongside the chevrons instead of plain text.
  • Snappier navigation between project tabs. Moving between tabs inside a project no longer fires a burst of channel-auth requests; the app now reuses live subscriptions across tab changes instead of tearing them down and re-establishing them.
  • Destructive confirmations say "Delete". Confirmation modals across tenant settings, central admin, attachments, AI keys, comments, and the backlog now label the destructive button "Delete" instead of a generic verb.
  • MCP link-branch returns structured errors. Duplicate-link and cross-project-mismatch errors now come back as readable error messages instead of opaque framework codes. Under parallel agent fan-out, callers can distinguish "already linked" from "wrong project" from infrastructure failures.

Hand-to-Claude visibility, comments redesign, and live time tracking

New

  • Claude-handed indicator on issues. When an issue has been handed to Claude, a Claude-orange indicator now appears on its board card, backlog row, and issue detail page — so teammates can see at a glance which issues are running.
  • Hand-to-Claude moved to its own tab. The Hand-to-Claude controls and eligibility check now live in a dedicated tab on the issue page, alongside Comments and Activity, instead of in the sidebar.
  • Automatic hand-to-claude label on Claude-opened PRs. Pull requests opened by a Claude session are now labelled hand-to-claude on GitHub so reviewers can spot them at a glance. The label is painted in Claude's brand orange.
  • Live updates for time entries on the issue sidebar. Starting, editing, or deleting a time entry now reflects on the issue's time-tracking sidebar in every open tab, without a refresh.
  • Date and time on the time tracking overview. The date column on the time tracking overview now shows both the date and the time the entry started, instead of date only.

Improved

  • Comments redesigned in a rail layout. Comments on the issue page now use a timeline rail with avatar nodes, an inline header with relative time, and action buttons grouped to the right. The Add Comment button has moved inside the rich-text editor.
  • Richer closing comments from Claude sessions. When a Claude session ends — whether it finished its work, idled out, was terminated, or expired — the closing comment now uses one consistent layout showing status, stop reason, iteration count, duration, total tokens, and grader feedback when the grader returned a failing verdict.
  • More reliable branch auto-linking. Branches named KD-XXX-<slug> now resolve to their issue more reliably. Adds a push-webhook fallback for branches whose create webhook never arrived; fixes two parser gaps — a regex that matched a project code as a substring of a longer code (e.g. project IT matching inside INIT-0001-foo), and a digit-padding mismatch that caused branches like KD-99-foo to silently not link because the parsed key was compared raw against the zero-padded KD-0099 in storage; and warns the server log when the pattern almost matches an issue, so near-misses appear in monitoring instead of being silently dropped.
  • Concurrent Hand-to-Claude runs are blocked. Trying to hand the same issue to Claude while a session is already running or pending now reports a clear error instead of starting a duplicate run.
  • Claude sessions that stop naturally now close cleanly. When a session reaches its natural end or hits a turn limit, it now posts its summary comment and closes out properly, instead of staying in an in-progress state.
  • create-issue and update-issue MCP tools return the issue URL. Both tools previously returned the project URL in the url field; they now return the direct issue URL.

Fixed

  • Successful Claude sessions no longer graded as failures. Two separate bugs caused this. First, the PR-evidence parser rejected the MCP tool's response shape ({id, url}), so sessions that successfully opened a pull request were terminated before the grader ever evaluated them. Second, the grader verdict reader looked for a webhook field that was never populated, so even sessions the grader approved were recorded as failures. Both are now fixed: sessions that open a PR and pass the grader are now recorded as wins.

Hand-to-Claude, AI attachments, and live updates everywhere

New

  • Hand to Claude. Admins can now hand an eligible issue to Claude for autonomous execution. Claude scores the issue against an eligibility rubric first; only passing issues proceed. Rolling out tenant-by-tenant.
  • AI story generation reads attachments. When generating a story from a report, the AI now pulls in attached images and text files (screenshots, plain text, CSV, JSON, Markdown) and uses them as prompt context. A per-attachment status panel shows which files were read and which were skipped, with the reason.
  • Live Reports overview. The reports list now updates in real time when teammates create, dismiss, promote, delete, or reorder reports — no refresh.
  • Quick self-assign on board cards. Click the user icon on an unassigned board card to assign yourself. A confirmation toast appears with an Undo action that reverts the assignment.
  • Sprint estimate totals on the planning view. Sprint rows on the backlog now show total estimated hours and an unestimated-issue count. A yellow chip warns when items lack an estimate; a green chip confirms when the sprint is fully sized.
  • Browser tab title reflects the page. The tab title updates to the current issue, project, or page context as you navigate, instead of always reading "kendo".
  • remaining_minutes on the Issue API. Every issue resource now includes remaining_minutes (estimated minutes minus logged minutes, or null if no estimate). Returned by the index, show, create, update, and project-scoped search endpoints.
  • --limit on kendo issue search. The CLI now accepts --limit N (default 25, max 500) on kendo issue search. A latent envelope-parsing bug that silently dropped results was also fixed on kendo issue search and kendo epic issues.

Improved

  • Faster project, board, sidebar, and team loads. Project, lane, sprint, and team responses no longer hydrate every related issue or member just to compute counts and IDs. Visible on tenants with thousands of issues — board page loads, sidebar navigation, and team settings no longer fan out a full table read per item.
  • Slimmer user responses. The unused issue_ids array was removed from user and profile resources, so /api/users no longer hydrates every listed user's full Issue rows.
  • Longer descriptions on issues, reports, and teams. Team descriptions now accept up to 5,000 characters (previously capped at 255 by the database column). Issue and report descriptions now store up to 65,535 characters regardless of emoji content.

Fixed

  • No duplicate issues from double-clicking Save. The Create, Edit, and Promote-Report forms disable the submit button while a save is in flight, so a fast double-click no longer creates duplicate issues or breaks back-navigation.
  • Issue detail page stays in sync. Issue fields, branch links, and watch status now update live across every open tab — the detail page used to require a manual refresh to see changes from another tab or tool.
  • Spurious "discard unsaved changes?" prompt on Create Issue. Opening the new-issue page and leaving without typing no longer triggers the unsaved-changes confirmation.
  • Tenant deletion now succeeds for billed tenants. Deleting a tenant in the central admin now correctly removes related subscription and GitHub install records before the tenant row. Previously the deletion failed with a database constraint error for tenants with an active Stripe subscription.
  • Issue update API no longer claims to accept attachment_ids. PUT /api/projects/{id}/issues/{slug} has dropped the attachment_ids field — it was silently ignored on update. Use the dedicated attachment endpoints to link or unlink attachments on an existing issue.

Unsaved-changes guard, password modal fix, and MCP project-context tool

New

  • prepare-project-context MCP tool. A new gather-phase tool returns the project, board lanes, active sprint, members, member count, and current user in one call. The companion prepare-issue-context tool is now slimmer — issue plus epic only — so flows that need both gather them in parallel instead of fanning out across separate kendo:// resources.

Improved

  • Pagination bar fits inside narrow columns. On the Reports overview and other narrow lists, the page navigator no longer overflows past the column edge. At narrow widths the first/last shortcuts collapse so the bar stays on a single row; at very narrow viewports the row wraps as a final fallback.

Fixed

  • Leaving an unsaved issue edit prompts before discarding. Editing any field on an issue and then navigating away — by clicking another link, hitting the back button, or closing the tab — now asks before discarding the changes. Saving clears the dirty state, so successful submits don't get a false-positive prompt.
  • Password confirm modal surfaces wrong-password errors. Entering a wrong password in the password confirmation modal now shows the inline error instead of silently closing. Cancel is also disabled while a submit is in flight, matching Confirm.

Per-issue watching and redesigned notification settings

New

  • Per-issue Watch toggle. Every issue page shows a bell next to the title — filled when you're watching, outline when you're not. Watching subscribes you to comments and status changes on that issue, even when you're not the creator or assignee.
  • Auto-watch rules. Three toggles under Settings → Notifications: auto-watch issues you create, are assigned to, or comment on. All three are on by default — turn off any you don't want.

Improved

  • Notification settings redesigned. Settings → Notifications now has two sections: Auto-watch rules and Email notifications. The email section bundles five toggles — @mentions, Issue assignment, Project membership changes, Team membership changes, and Activity on issues I follow (comments, status changes) — one row per event. The previous lane-based allowlist is gone; to stop getting activity notifications on a specific issue, click the bell on that issue to unwatch it.
  • Notification rows show read state by font weight. Bold = unread, regular = read, with a red dot still marking unread. Team-membership rows display a tooltip ("You were added to team X") and are non-clickable.
  • "Mark all as read" actually marks them all. The button now collects every unread notification when nothing is individually selected, instead of doing nothing.
  • AI Generate uses your latest report selection. Adding more reports to the AI panel after it opens now feeds those new reports into Generate. The panel previously captured only what was selected when it mounted.
  • AI Generate accepts longer merged-report prompts. Combining several sizeable reports into a single Generate request is less likely to hit a length cap — the per-request limit was widened to fit merged payloads.
  • Logged-in user pinned in assignee and creator filters. Your own name floats to the top of the assignee and creator dropdowns on Board, Backlog, Overview, and My Issues — just under Unassigned in the assignee list, and first in the creator list.

Fixed

  • Newly created report auto-selects in the detail pane. Submitting "+ Report" leaves the right pane on the new entry, so verify-and-edit is one continuous flow.
  • Promote acts on the report you can see. Checking report A, dismissing it, then clicking B and pressing Promote no longer sends A's id to the server. Dismissed reports are automatically deselected.
  • Dismissed reports leave the Selected pane immediately. No hard refresh required.
  • AI Generate works on the first click again. A wire-format mismatch caused every Generate click on Reports and Issues to surface a "source description field is required" toast; resolved.
  • Login "Remember me" persists sessions across browser restarts.
  • Billing seat count and the upcoming invoice match. The Pro billing page reads seat count from the same source as Stripe, so the displayed number always matches what's invoiced.
  • Lane reorder chevrons redraw the page on click. The up/down arrows in Project Settings → Lanes again move the lane visibly — the new order was being saved but the view wasn't refreshing.

Self-serve signup, inline images, and admin-invite tenants

New

  • Self-serve workspace signup. Anyone can sign up at central.kendo.dev/signup, click a verification email to activate the workspace, and sign in. Pricing CTAs now point straight at signup, brand-new workspaces land on an onboarding hero, and signing in before verifying surfaces a resend button with a cooldown.
  • Inline image paste in descriptions and comments. Paste screenshots straight into issue descriptions and comments — including while editing existing comments. Hovering an inline image reveals a toolbar to maximise to a lightbox, download, copy to clipboard, or open in a new tab.
  • Admin invite when central admin provisions a tenant. The tenant-create form now collects the first admin's email, first name, and last name. When the workspace is provisioned, the admin reliably receives a tailored "Your Kendo workspace is ready" welcome email with a one-click claim link.

Improved

  • File thumbnails are easier to click. The whole tile previews on click, with download and delete sitting in the footer next to a tooltip-truncated filename. Tiles and icons are also slightly larger.
  • Sidebar collapses on touch devices. Landscape phones and tablets no longer get a desktop-width sidebar squashed into the viewport — touch is detected by pointer/hover capability, not viewport width. Board cards also truncate cleanly at narrow column widths.
  • Project color dots in the sidebar match the Teams overview. The sidebar now reads from the same color source as the Teams page, so a project's accent looks identical wherever it appears.
  • Modal close button is keyboard- and screen-reader-accessible. Keyboard navigation tools and screen readers can now reach and announce the close action.
  • Loading… in English everywhere. A Dutch "Laden…" fallback that survived the April language cutover now reads "Loading…" across every async-mounted modal.

Fixed

  • First-time GitHub App install handshake is reliable. Install state is now stored server-side, so the central callback can reliably find it regardless of which tenant context is active.
  • GitHub App install flow is hardened. Stricter callback-state validation, per-user rate limiting on install endpoints, and tighter origin checks on the install popup's postMessage channel.
  • Issue activity enforces the same per-user access as the issue itself. Reaching an issue's activity timeline now requires the same permission as opening the issue.
  • AI story generation no longer leaks validation errors. Short or vague AI input is handled by the pipeline instead of dumping a raw validation error into the issue form.
  • Long project descriptions save reliably. Saving a project description longer than 255 characters used to fail with a server error; descriptions up to 5,000 characters now save as expected.
  • No duplicate "added to project" notification. Linking a team that already shared members with a project no longer fires a second "added you to project X" notification at those existing members.
  • Reports without an author show the creator's name. Reports created from the in-app form previously rendered "Unknown"; they now fall back to the creator's full name.
  • Deleting an issue unlinks promoted reports. Issues created from a promoted report can now be deleted — the linked report returns to Pending so it can be triaged again. Bulk delete handles this too.
  • Epic badge no longer overflows parent containers. Long epic names truncate cleanly within their row.
  • Comment delete confirmation stays a fixed size. The modal no longer renders the comment body inside the dialog, so the cancel/submit buttons remain reachable for long comments at high zoom.

Team-scoped user visibility and steadier real-time updates

New

  • Team-scoped user visibility. Members now only see colleagues who share a project or team with them. Workspace admins, and roles granted the new "Access all users" toggle in the role form, retain full visibility.

Improved

  • Profile pictures on the activity timeline. Each row's avatar now shows the actor's uploaded picture, falling back to initials when there isn't one.
  • Backlog, Board, and Overview search matches title and key. Description text no longer counts toward results — the placeholder reads "Search by title or key…" to match.

Fixed

  • Live updates from queued events. All real-time updates — board drags, issue edits, comments, branch links, AI progress, and more — now reliably reach other open tabs.
  • Real-time updates on long issues. Issue broadcasts now carry a slimmed-down payload, so an issue with a lengthy description no longer fails to deliver live updates to other open tabs.

Self-serve GitHub App, MCP issue intents, and a raw-markdown editor

New

  • Self-serve GitHub App connection. Settings → GitHub App now has an "Install GitHub App" button that opens a popup, walks through the install on github.com, and lands you back in kendo with the installation linked to your workspace. Once installed, the page shows the connected account name and type plus a Disconnect button — no manual configuration step.
  • assign-issues-to-sprint MCP tool. Move up to 100 issues into, between, or out of a sprint in a single call. Replaces the per-issue update-issue loop agents were running for sprint planning.
  • start-work-on-issue MCP tool. One call assigns the issue, moves it into a lane, optionally sets its sprint, and links a branch — the multi-step pickup workflow agents were running by hand collapsed into a single intent.
  • prepare-issue-context MCP tool. One call returns the issue, its epic, the project's active sprint, all lanes, and the calling user — replacing four separate kendo:// resource reads.
  • Raw markdown toggle in the rich text editor. A new </> toolbar button swaps the editor for a plain textarea showing the markdown source. Format buttons grey out while in raw mode.
  • H1 / H2 / H3 buttons in the rich text editor. Three new heading buttons in the toolbar, separated from the inline-format buttons by a thin divider. Heading sizes inside the editor now match the rendered description.
  • Backlog tab before Board. Project navigation lists Backlog → Board, matching the issue lifecycle order. The default landing for /projects/:id is unchanged.

Improved

  • My Issues badge and page update live. The sidebar count and the issue list both reflect newly-assigned, dragged-to-Done, and self-assigned issues without a refresh, including changes made via MCP.
  • Sprint dropdown hides completed sprints. When picking a sprint on an issue, the dropdown only offers active and planned sprints. If the issue is already linked to a completed sprint, that sprint stays visible so saving doesn't silently unlink it.
  • Issue Show page card matches the detail-page pattern. Card padding and corner rounding line up with the rest of the app, and badges no longer stretch to full width inside column layouts. The doubled border under the user profile settings list is gone too.
  • Delete confirms name the action. Confirmation dialogs show "Delete sprint" or "Delete epic" instead of a generic "Confirm".
  • Issue tab labels match section header sizing. Small typographic polish on the issue detail page.

Fixed

  • Clearing a title or description no longer drops the save. Form fields cleared by the user now send null instead of an empty string, so the server correctly distinguishes "no value" from "value too short" and the change goes through. Regression from the validator pass two weeks ago.
  • Assignee avatars on the Activity tab. Assignment changes in the activity timeline now render the user's avatar instead of a broken-image placeholder.

Central admin dashboard, issue activity, and a live inbox

New

  • Central admin dashboard. A new Overview page on the central admin app with stat cards for tenants, domains, users, and waitlist, a GitHub card showing how many tenants are connected, and drill-down tables for the 5 most recent tenants, tenants without GitHub, and unclaimed installations. Stat cards click through to their detail pages.
  • Issue Activity tab. A read-only timeline on every issue detail page, showing who changed what and when — status pills, priority and type icons, assignee avatars, sprint and epic pills, and expandable word-level diffs for title and description. Newest-first, grouped by day.
  • Live inbox. The notification badge in the navbar and the inbox list now update live across every open tab. No more reloading to see a new notification, and "mark all as read" reflects everywhere instantly.
  • Live sprints, epics, and lanes. Boards, backlogs, and epic overviews now stay in sync across tabs in real time when someone else creates, renames, or deletes a sprint, epic, or lane — no refresh needed.
  • Live branch links. The git branch sidebar on an issue updates live when teammates link, edit, or unlink a branch.
  • Bulk-assign issues to an epic. From the backlog, select multiple issues, switch the action bar to "Epic" mode, and pick an epic (or "No epic" to clear). All selected issues update in one go.
  • Auto-fill start time on the time entry form. Tick the new "Auto-fill start time" box and the start time is computed from the duration as you type. Existing entries are left alone until you edit the duration. Your preference is remembered across sessions.
  • Edit which projects a tenant AI key applies to. Tenant AI key cards now show "Allowed on N projects" or "Allowed on all projects" with an Edit button, so you can change the scope of an existing key without recreating it.
  • Pagination on the Reports overview. Page-size selector (10, 25, 50, 100) below the reports list. The page resets when you change the status filter or search.

Improved

  • You float to the top of assignee and creator filters. On the issue list pages, the active user is now pinned at the top of the multi-select dropdowns — no scrolling to filter by yourself.
  • Dropdowns cap at 500px on wide screens. Select dropdowns no longer stretch across the page on big monitors. Inside modals and on mobile they still fill the available width.
  • Consistent text-area sizing. Multi-line text fields are now the same height and padding everywhere; the same field used to look noticeably taller inside modals than on plain pages.
  • Restyled rich text editor toolbar. A compact pill of icons inside the editor instead of a full-width header strip, with subtler buttons and a red focus glow that matches the rest of the form.

Fixed

  • Selected values in dropdowns no longer look empty. Picked Epic, Sprint, and Assignee values now render in solid text instead of the muted placeholder color, so a filled field doesn't look unset.
  • Multi-line text fields read more easily. Bumped line spacing so paragraphs in textareas no longer feel cramped, including the Log Time modal where text was rendering noticeably small.
  • Removed the redundant "issue updated" toast. The "Alert: updated by " pop-up was duplicating live updates that the board, backlog, and issue overview already show. It's gone.
  • Board no longer goes blank if a saved filter is in a bad state. Old or hand-edited filter values in browser storage used to crash the page; they now fall back to defaults.
  • Activity tab badge is correct on first paint. The activity count on the tab used to read 0 until you opened it. It now reflects reality immediately.
  • Activity tab error state. When fetching activity fails, the tab now shows a dedicated error message instead of looking like an empty timeline.
  • AI generation no longer fails the whole request when realtime is down. AI progress toasts may lag, but the underlying request completes instead of erroring out.

VS Code extension, Kendo Today MCP widget, and live comments

New

  • VS Code extension. A VSC-Kendo sidebar showing the active sprint's issues, browseable by lane via tabs and split within each lane into Assigned to Me, Unassigned, and Assigned to Others. Per-issue actions let you move issues between lanes, create or open a GitHub branch for an issue, and assign or unassign yourself. Sign in with a personal access token stored in VS Code's secret storage.
  • Kendo Today MCP widget. A sandboxed iframe mini-app that renders inline in Claude Desktop. Initial data arrives via the kendo-today-tool result on spawn; users can log time via per-issue quick-log chips and open issue deep-links in the default browser.
  • Live comment updates. Comment create, update, and delete mutations broadcast on the comments channel, so other open tabs see them live without a refresh — the same pattern already powering live issue events.

Improved

  • Tighter Stripe outbound timeouts. Billing API calls use explicit 10s total / 5s connect timeouts instead of the SDK's 80s / 30s defaults, so misbehaving upstreams fail fast instead of hanging interactive flows.

My Issues, live boards, timetracking measurements, and MCP polish

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.
  • Timetracking measurement switcher. Choose Hours, 7h, 7.5h, or 8h workdays and every duration on the page (summary, totals, per-entry, modal inputs) re-renders in that unit. The choice is saved in your browser and applies across the summary card, time-entry table, and entry form.
  • Live create and delete. Cards appear and disappear across every open tab as they happen.
  • Public changelog at kendo.dev/changelog. A single-page feed of dated entries, newest first.
  • "What's new" sidebar link. New entry in the tenant sidebar opens the changelog in a new tab, with a "new" pill (or a red dot when collapsed) for 4 days after the latest entry ships.
  • Board moves now appear in the audit log. Reorders are recorded alongside other issue changes.
  • Search truncation banner. Board, Backlog, Overview, and My Issues show "Showing first 500 matches. Refine your search to see more." when the server-side cap is hit.
  • fetch_attachment returns image attachments. Image content now comes back inline in the MCP response — the image path was previously broken.

Improved

  • Batched board reorders. Multi-card drags fire one UPDATE instead of one per card.
  • Live updates apply instantly. Issue changes from other users now show up in the board, backlog, and overview without a follow-up round-trip — the listening client used to refetch each updated issue.
  • MCP tools no longer show a phantom error on claude.ai web. Successful tool calls were displaying a generic "Error occurred during tool execution" because the response shape didn't match what the spec requires; 28 tools were migrated and now render correctly.
  • MCP search tools surface truncation. search_issues and get_my_issues now return truncated and limit in their response so MCP callers know when the 500-result cap was reached.
  • search_issues is faster and reliable. The tool was throwing on every call on staging and silently making three extra database lookups per result on production; both paths are fixed.
  • Time entries default to newest-first by start date. The All Entries table now sorts by when work happened, not when the entry was recorded. Entries without a start time fall back to creation date.
  • Inline measurement pills on the time summary. The measurement selector on the All Entries page moved from a dropdown with a help icon to a segmented pill control tucked inside the Total card.
  • Admin UI is permission-gated. Teams overview, User Management, and the Roles link are hidden from regular members — they only see admin surfaces their role permissions explicitly grant.
  • Single git-checkout box on issue pages. The "git checkout -b" suggestion box is now hidden whenever a branch is already linked or another branch form is open, so it no longer stacks visually on top of the per-branch checkout boxes.

Fixed

  • Hardened Stripe webhook verification. Misconfigured deployments now fail at boot instead of accepting traffic.
  • fetch_attachment error handling. Unexpected errors now return a clean message instead of an internal exception.
  • send_feedback error responses. Returns a clean message when the feedback service is unavailable.
  • OAuth consent screen. MCP connections via Claude Code now go through the standard authorization consent flow on first connection. (Claude Desktop is not yet supported.)
  • 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 an optional status integer — 0 (Pending), 1 (Promoted), or 2 (Dismissed) — and the kendo report list CLI accepts --status pending|promoted|dismissed.

Improved

  • No more dropped cards on large boards. Board, Backlog, and Issue Overview were silently using the /search endpoint's 25-item default because no limit was passed, dropping cards on bigger projects. The pages now pass limit=500 explicitly, and the endpoint's hard cap was raised from 100 to 500 to match. 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 read image and text attachment content inline via MCP — images up to 5 MB, text up to 500 KB. Binary formats like PDF and video fall back to the existing download URL.
  • send_feedback MCP tool and kendo feedback send CLI. Submit feedback (title + description) straight from an AI assistant or the terminal.
  • Synthesised title in feedback submissions. Feedback sent from the in-app widget is automatically attributed to the authenticated user — no title field to fill in.
  • Deep-linkable reports. Every report now has a hover-revealed copy-link button for sharing, plus a new GetReport MCP tool and kendo://reports/{id} resource so agents can fetch a specific report directly.
  • Backend proxy for images and attachments. Profile pictures and attachments now serve through stable backend routes instead of expiring signed S3 URLs, fixing intermittent broken-image errors.
  • create_task agent intent handled. The frontend now correctly handles the create_task classification from the AI assistant — previously it fell through to a generic handler.

Improved

  • Scoped /search on Board, Backlog, and Issue Overview. Listings now fetch a scoped page instead of a full project dump. New filters (sprint_id, include_backlog, sprint_status, since) let each page ask for exactly the slice it renders.
  • Slim update-board response. Board moves return only the changed positions; the frontend merges them in place, skipping a post-drag refetch.
  • 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. Using the forgot-password flow to reset a password now also wipes any pending invite token, so the "resend invite" button no longer stays visible after the invite is consumed.
  • Notifications are cleaned up on project or team delete. Deleting a project or team now removes associated notifications, keeping the inbox stable.
  • Password-reset link error handling. Expired or invalid password-reset links now return a proper error response instead of a server error.

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 admin-granted Pro, revoke it, or cancel a Stripe subscription). 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 provider errors now return the right HTTP status instead of a generic 500: rate-limited → 429, provider overloaded → 503, request too large → 422, generic provider error → 502.

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.
  • Audit log integrity. Audit-log writes enforce hash-chain consistency under concurrent load.

Fixed

  • OAuth invite with an already-linked provider. Completing an invite with a provider already linked to another account now returns a provider_already_linked error cleanly, for both invite and link flows.