PdfRedactor, so a covered word is actually gone
A filled rectangle drawn over an account number hides it from the eye and from nothing else: the glyphs stay in the page's content stream, and a copy-paste or a...
Report a failed association at WARN, not at DEBUG
Lead association swallows its failures on purpose — a problem attaching a message must never break the sweep that was reading the mailbox — so the log line is t...
Flush the link, so a refused write reaches the catch that reports it
link() is @Transactional(REQUIRES_NEW), so its transaction commits in the proxy after the method body returns. A plain save() of an entity whose id is generated...
Print the whole quote, not just its first page
The print stylesheet reset the Dialog's container and its Paper to static flow but left the Dialog ROOT alone — the element this component labels quote-print-po...
Keep an option card and its lines off a page break
The per-option line table was added without the page-break rules its sibling table has, so a long option could be cut across pages mid-row.
Link the articles a draft names
The authoring convention is to name a sibling article by putting its title in italics — "Read *Security Roles Explained* before building them". 181 spans across...
Rebuild against kamo-shared-library HEAD
Ships the lead contact location fix, which lives in the shared library: LeadDTO now returns the lead's own country, subdivision and timezone, so the three Prima...
Save the Primary Contact country, state and time zone
The Primary Contact card's country, state and time zone are top-level Lead fields — neither members of primaryContact nor of addressMailing — and the two wire b...
Return the contact's country, state and time zone
LeadDTO carried neither Lead.country, Lead.subdivision nor Lead.timezone, so the three fields were write-only: UpdateLeadRequest accepted them and LeadService w...
Hold withTermsUnchanged to carrying every field
The method rebuilds UpdateQuoteRequest positionally, so a field added to that record and forgotten here is dropped from every save by a member without EDIT_QUOT...
Stop dropping setupFee on save, and unbreak the build
withTermsUnchanged rebuilds UpdateQuoteRequest positionally for a member who may not rewrite the terms. setupFee was added to that record and not added here, so...
Read either address shape so the block cannot go blank
Reading only the new addressLines makes the address disappear when the API has not been rebuilt yet and is still sending addressLine plus addressDetails. A blan...
Read either address shape so the block cannot go blank
Reading only the new addressLines made the address disappear from the printed quote outright, because this shipped ahead of the API that sends it and a server s...
Rebuild against kamo-shared-library HEAD
Ships the quote document work, all of which lives in the shared library: - a one-off setup fee on a single-price quote (commerce_quotes.setup_fee, which is a...
Print the address as the lines it is written on
Splitting the suite into its own field left the street and the city still sharing a line, with the unit printed beneath them. The address now arrives already sp...
An address is several lines, so send it as several lines
Splitting the suite out of addressLine was not enough — it left the street and the city sharing a line with the unit printed beneath them, which is worse than t...
Print the address as the lines it is written on
The address arrived as one string, so a real one came out as '4300 West Tropicana Ave Building A Main Floor Suites 110-132, Las Vegas, NV 89103' — not something...
A setup fee on a single-price quote, and the suite on its own line
The setup fee existed only on multi-option quotes, so 'One price' had no box for one — on the form or on the printed page. It now sits beside Shipping, appears ...
Commerce_quotes.setup_fee
A one-off setup fee on a quote that presents a single price. The fee already existed on QuoteOption, where each alternative carries its own; a flat sheet had no...
A setup fee on a single-price quote, and the suite on its own line
Two things a quote could not state. A one-off setup fee lived only on QuoteOption, where each alternative carries its own. A flat sheet has no option to hang o...
The suite on its own line, and a setup fee on a single-price quote
Two things the printed page could not say. An address arrived as one comma-joined string, so 'Suite 400' ran into the street and the city — not how an address ...
Reprice stored quote totals through the pricing engine
Quote money columns are written, not computed on read, so the two corrections that landed on 2026-09-02 — a unit price is a per-month rate the term multiplies, ...
Expose repricing as a static so a backfill can reuse it
Quote money columns are written, not computed on read, so an engine correction leaves existing rows carrying the old arithmetic until something saves them. A mi...
Print the full line on the customer's quote
Each line showed a name and an amount. That asks the customer to take the quantity, the unit, the rate and any reduction on trust, and leaves them nothing to ch...
Print the full line on the quote, and stop losing work at the mode switch
Two things a quote could not do. The printed line items inside an option card showed a name and an amount, nothing else — no quantity, no unit label, no rate, ...
Re-issue a share link from its row, and stop losing the one-time URL
The Share links list offered no way to view or copy a link, and nothing explained why. Nothing can reveal an existing one — only the token's SHA-256 is stored, ...
A share link's email was dropped twice before it could be sent
"I created a link and got no email." Two independent silent drops, both of which return a swallowed false that the panel rendered as plain success. 1. kamo.ema...
Pin the quote letter's dotted templateKey, as the HR family already is
The constant is not the templateKey. CanonicalTemplateLoader.load derives only the FILENAME from the constant (QUOTE_SENT -> quote-sent.json) and reads template...
Restore the timestamp that every lead association depends on
A method was inserted between @CreationTimestamp and the dateCreated field it annotates, so the annotation bound to subject() instead. These entities are read b...
Re-derive the rail's hover-peek instead of trusting two events
The collapsed rail's peek state was written by exactly two things, pointerenter and pointerleave on the rail itself, and nothing ever re-derived it from where t...
Send MUI's styles with the markup that needs them
internal.kamocrm.com was serving a 1.34 MB document containing 123 `css-xxxx` class names — `MuiBox-root css-e26q24` among them — and not one rule for any of th...
A reopened conversation is the one you were having
A member started a chat about KB articles, minimized it to its hexhead, went to their mail and brought the window back to a blank conversation — "having to star...
Read a new lead's phone number against the country it is in
The New Lead form asks which country the lead is in, then ignored the answer when reading their phone number. Both PhoneField instances and the validator fell t...
Do not follow a protocol-relative link in-app
"//example.com" starts with a slash but is another origin. The in-app branch matched it and would have handed router.push an off-site destination; it belongs in...
Drop a @Transactional that never applied
loadCatalogue is reached from catalogue() on the same bean, and self-invocation does not pass through the proxy, so the annotation was decoration. The query is ...
Rebuild against kamo-shared-library HEAD
Ships the quote pricing fix: a unit price is a per-month rate, so a term multiplies it rather than the engine dividing down to it. An annual option quoted one m...
Mirror the monthly-rate reading in the editor preview
previewOption divided the line-item sum down to a monthly figure the same way the server did, so the card and the print preview showed one month of any term. A ...
A unit price is a MONTHLY rate, so the term multiplies it
The engine treated an option's line-item sum as the price for the whole billing period and divided down to reach a monthly figure. It is the other way round. P...
Follow a link without losing the conversation
Reported alongside the KB links all pointing at one article: "when it is fixed and they will work, please let the AI chat still hover on top so you don't have t...
Resolve the articles a passage names into link targets
A hub article — "Setting Up Your Organization — A Checklist" is one — exists to send the reader to a dozen others, and names every one of them in plain text. Th...
A KB link goes to the article its text names
A member asked how to set their org up and got the setup checklist back, each step naming the article that explains it. All three links pointed at the same arti...
Keep the words typed after an inserted photo
The same reported message had a sign-off underneath its photo. That did not arrive either — the reading pane showed an empty body above the attachment. There i...
Let a photo attached from a phone be opened
A member sent themselves a message from an outside account with a file attached. The message arrived; the file was nowhere in it — no preview, no download link,...
Fix the Reports tab's folder heading nesting
The per-folder count Chip sat inside the heading Typography. MUI renders subtitle1 as an h6, which takes phrasing content, and a Chip is a div — so the count wa...
Give a folder with an ampersand in its name its message count
A mailbox called "Bugs & Enhancements" showed no count in the sidebar while every folder beside it showed the right one, and the mailbox totals were short by ex...
Give the annotation tools their tooltips back
The five annotation tools in the PDF designer built their tooltip key by interpolating the tool type onto a "tool_" prefix, but the dictionary names those same ...
Ask whether the guests should be told, and how
Adding a guest to an event did not tell them, and the dialog never said so. The only thing that ever wrote to a guest was a reminder — which reaches a colleague...
The columns that let an event invite its guests
Three on calendar_events, because whether a meeting invites people belongs to the meeting rather than to the moment it was saved — an edit six weeks later that ...
Send the meeting invitation the guest list implied
Adding somebody to an event's guest list did not tell them. Only a reminder ever wrote to a guest, and a reminder reaches a member in-app and an outside address...
Let an event invite its guests, and put it on their calendar
Saving an event told nobody. The guest list was materialized and the audience stored, and the people on it heard nothing until a reminder fired — which reaches ...
Je, unaona nini kuhusu usafiri?
Kila kitu kinaingia kwenye tovuti yako mwenyewe. Anza kwenye mpango wa bure na usome ukurasa huu tena katika mwezi mmoja.
