Guard the confirmation on a single-message delete
A member reported deleting the wrong email from /messages: the row's trash icon fired straight through to the API, so one stray click on the right edge of a row...
Drop the container ref nothing reads
containerRef was declared and attached to MessageBrowser's root element, but containerRef.current is never read anywhere in the file — it has been dead since it...
Give the SEND TO AI switch an accessible name
The switch set its aria-label through `inputProps`, which MUI 7 drops on Switch without a warning — so the label never reached the DOM. The words SEND TO AI bes...
Open Send To AI from the report window instead of dispatching
The SEND TO AI switch handed the report over the moment it was filed. It POSTed a bodyless dispatch, which left SecurityService to choose the instruction, the m...
Pin the well-known folders to the top of the sidebar
Inbox, Drafts, Sent, Junk, Trash and Archive stop moving. They hold that order at the top of the folder list, and everything the member made sits underneath und...
Reach the conversation on screen when it is pages down the list
Switching the navigator to the right tab was only half an answer. The list pages by last activity, 30 rows at a time, and the conversation a member has maximize...
The Report Studio — a library, and one renderer for every report
/reports is a shelf, not a card grid: two hundred identical rounded boxes is a wall to scan, and a row gives a report's name room to be read. Saved views nest u...
Stop the offline banner standing as a column beside the mail
Same defect the search results bar had, in the same container. MessageBrowser's root was a horizontal flex row whose children are the columns of the mail client...
Say that the status-label save is a whole set, not a patch
The endpoint's meaning changed underneath this client: a status left out of the list is now a deletion rather than a no-op, which is what lets a label be remove...
The importer, and three things it taught us
Publishes the corpus by driving the real KBService API rather than writing rows -- a direct INSERT skips the version row, the kb.article.published event that is...
Send a cleared status label as a removal, not as silence
Emptying a custom label box and saving did nothing. The save built its payload from the labels that had text in them, so a box the org had just cleared was not ...
Do not claim nothing matched when a filter hid the matches
The empty-list explanation added with the search results bar keyed off the query alone, so it also fired when the search had matched plenty and the Unread or St...
Stop mail search opening a strip down the side of the screen
MessageBrowser's root element is a horizontal flex row whose children are the columns of the mail UI. The search results bar was written as a bottom bar -- bord...
Follow the maximized chat window's tab in the navigator
Maximizing a chat popup left the conversation navigator on whatever tab it was already showing. `visibleRows` drops every row outside the active bucket, so the ...
The Report Studio design — Java-defined reports, a generic renderer
Reports are defined as Java classes in kamo-shared-library and rendered by one capability-driven frontend, so adding a report is a new class and nothing else. ...
Choose who a quote names as the customer's contact
The market dialog gains "Quote's Future Contact" under Enable quotes: the lead's assigned agent, a choice made per quote, or one explicit person picked with the...
Stop Send To AI resetting the boxes while they are being typed in
A member filed this against the Send To AI dialog: the description "often resets back to the original description while you are editing it". It reset the instru...
The article corpus, and the pipeline that builds it
307 articles across 16 categories and 29 sections, from the 248 draft articles under Documentation/ plus 59 written here: every category and section landing pag...
A window that raised itself has not been read
The chat unread badge was invisible everywhere — the Chat button, the Interaction Center, the hexhead — and the reason was not the badge. All three read one cou...
Curate an article's related articles
KbRelatedPanel is one component in three places: it curates in the composer and the editor, and reads back on the article view. Adding an article here also adds...
Add the missing form-fillable route, and stop offering ungranted actions
Two defects behind one report: the PDF editor would not open, and delete was offered to a member who may not delete. **The editor.** DocManager posts to /api/d...
Ride down to your own message when you had scrolled up
Sending while scrolled up into the history left the member parked where they were, with their own message appended below the fold. From the seat it looks exactl...
Design for the Help Center KB build, related articles, and public wiring
Covers the 248 source drafts under Documentation/, the tree they map to under the existing Help Center article, the new KB_ARTICLE_RELATIONS feature, and the th...
Take the two "could not start" fallbacks out of the source
Both SMS refusal paths quote the server when it gives a sentence and fall back to one of their own when it gives only a machine code. Those two fallbacks were E...
Offer the billing term up front, and stop hiding it over Enterprise
Two separate ways this page withheld the choice. The org console HAD a three-term control, but it was tucked into the right of the "Choose plan" heading behind...
Quote the commitment saving in dollars on the plan cards
The discount is a flat $10 a year and $20 on three years, which is how the catalog sets it and how it is advertised everywhere else. Rendered as a percentage it...
Say which subscription the launchpad pill's gate is about
"Not already paying" means the VIEWER's own seat — the same question the Plans & billing page answers when it decides whether to offer them one. Worth stating, ...
The running offer, on Plans & billing and on the launchpad
The console quoted list prices while kamocrm.com advertised a third off the same plan, because nothing in kamo-internal could see that an offer existed. It now ...
Sell the three-year term, and stop four copies of the cycle drifting
The billing cycles were typed out by hand in five places. One of them, the plan-pricing editor, offered "BIENNIAL" — a value the server has never had — so choos...
Show the report title in Send To AI, editable
The dialog let an operator edit the instruction and the description but never showed the title, and the title was not in the message either — the session at the...
Land the header's Text, Chat and Note buttons on the tab they name
The lead view keeps its tab selection in the URL — `tab` for the main tab, `commsTab` for the Communications sub-tab — and a header quick action sets both: "Tex...
Say why a number could not be opened, instead of an empty dialpad
Opening the SMS tool on a phone number resolves a conversation for it first, and that resolve can be refused — VOIPService answers "no number to text from" with...
Reply to a message, and take the reader to what it answers
MediaService has carried a reply's parent and the quote to draw for it since "send the quote with a reply, not just the pointer"; this is the half that shows it...
Stop offering an edit once somebody else has read the message
Every chat window that draws a MessageBubble — the member chat popups, and the social and ticket conversations that share ChatBox — offered Edit on the sender's...
Darken the xAI mark so it shows on the provider dropdown
Simple Icons ships the xAI glyph filled #FFFFFF, which is its brand color on a dark surface. The AI provider dropdown is white and the app forces light mode, so...
Offer Move on a right-clicked message, not only on a ticked one
Right-clicking a message offered Reply, Reply all, Forward, Report Spam, Archive, Label and Delete. Filing it anywhere other than Archive meant dismissing the m...
Go To Settings leads the Settings menu, above the app list
Reported with two screenshots — one org with eleven enabled apps, one with two — each circling "Go To Settings" at the bottom of the Settings sub-option menu wi...
Let a bulk move reach the folders the member made
The "Move to folder" dialog behind the selection bar was built from a literal ['INBOX', 'Archive', 'Trash', 'Junk', 'Drafts'], so the only destinations it ever ...
Never leave a blank tab when a KamoDesktop launch stalls
The tab is opened blank inside the click gesture and only navigates once a link comes back. So anything slow upstream showed as a blank white page with no expla...
Make smart folders reachable, and make clicking one work
A smart folder is a saved search that sits where a folder sits: name a question once ("unread, with an attachment") and it is one click away, current every time...
Make eslint actually run
`eslint .` reported nothing at all — not a clean tree, but a crash before it loaded a single file: TypeError: Converting circular structure to JSON at ...
The report form's questions move off the field's border
A member filed this against the report form itself: "What happened?" — and "What would you like to see?" on the enhancement side — had the field's border runnin...
A stamp that says which day, once the day is in doubt
Reported by a member: past chats cannot be identified or verified by the date they were sent or received — only a time is present. Their own history runs back t...
A new chat shows the exchange instead of going blank
Open a new AI chat, type a message, and the thinking bullets appeared and then nothing — no sent message, no reply, just the empty-conversation panel over a tra...
Let the sidebar's calendar checkboxes actually turn off
The checkbox beside each calendar was bound to `calendar.isVisible` and its onChange was `fetchEvents`. `isVisible` is sent by EmailService and written back by ...
Leave a group chat, and keep the line that records it
Leaving is offered at the foot of the roster popover, separated from the rows above it because it belongs to the member rather than to anyone in the list, and c...
The Favourites header must control an element that exists
Collapsing the section unmounted the list it named through `aria-controls`, leaving the header pointing at nothing. `aria-expanded` then describes a disclosure ...
One title rule, one group threshold, and a rename the list hears
Review of the Chats branch, four findings. Both surfaces were composing the conversation's name by hand instead of through the helpers @kamo/chat-core exports ...
Open on Chats, a Favourites section, and a group chat you can manage
Five requests from a member, all of them about the same gap: the Chats panel could show you conversations but gave you nothing to do with them. Chats is now th...
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
