Send the event's instants, and keep the end after the start
The two datetime fields hold offsetless wall-clock text and the API binds them to a java.util.Date, so the server read them in ITS zone — UTC. A member setting ...
Actually move an event when its calendar is changed
The dialog has always offered a calendar picker when editing and the PUT has always carried the chosen calendarId, but updateEvent had no parameter for it — so ...
Widgets are configured by security rights, and nothing else
The timecard widget's rights mirror moves under MANAGE_TIMECARDS, so all five widgets have one shape. The availability-hook machinery is removed with it — useA...
Drop the universal seed; the timecard widget follows MANAGE_TIMECARDS
UNIVERSALLY_SEEDED_RIGHTS is removed entirely. It existed only because the timecard widget had no parent right to inherit from, and now it has one — so the widg...
Put the timecard widget under the HR group, like every other widget
TIMECARD_TODAY_WIDGET now hangs off MANAGE_TIMECARDS instead of being a root, so all five widgets have the identical shape the calendar ones set: a parent data ...
Restore the CRLF line endings in CalendarEventAttendeeRepository
A scripted edit rewrote the file through a text API, normalising all 62 CRLF line endings to LF and turning a 15-line addition into a 139-line diff. The content...
Restore the CRLF line endings in calendar.ts
A scripted edit rewrote the file through a text API, which normalised every one of its 257 CRLF line endings to LF and turned a 45-line addition into a 559-line...
Removing from Selected Docs unchecks the row
The mirror ran one way. Removing a document deleted the binder item but left its checkbox ticked in the grid, so the next sync — on the very next visit to the t...
Stop rounding document ids into nothing
A document id is a 19-digit int64 — 1200096283020258886, some 133x past Number.MAX_SAFE_INTEGER. OrganizerTab joined the selection into a key so the effect woul...
Quote the annual rate under the "billed annually" caption
The homepage cards read the month-to-month rate out of the catalog and printed it above a line saying "billed annually", so Starter advertised $34 and Business ...
Let an unscoped binder hold its own grid's documents
sameCollection demanded an exact assoc_object_id match in both directions, which made every binder in My Docs refuse every document My Docs was showing it. The ...
A minimized chat is neither read nor silent
Two bugs that shared a cause: the only flag saying "this window is minimized" was pinned false, so everything that asked it silently did nothing. An arriving m...
A member chat's own reads clear its badge, and a reply counts as one
Two gaps left over from giving the support window this treatment. Sending a message cleared nothing. The chat core marks a conversation read when it starts, wh...
Stop flexbox crushing the When card down to its header
The start and end fields were not clipped by their own width. The card holding them was being shrunk to nothing. A flex item's automatic minimum size — `min-he...
Stop cutting note bodies off at 500 characters in the timeline
The All tab of a lead's communications rendered a note through LeadCommunicationMapper, which capped the body at 500 characters — with no ellipsis and no flag, ...
Take leads-available from the server's per-product counts
leadsByProduct was derived from the allotment rows, which only cover products someone already holds a credit rule for. The grid lists products from the vendor c...
Report leads available for products with no allotment
/manage built its whole response by looping over allotments, calling countAssignablePool once per row. But the Manage-Credits grid lists products from the vendo...
Give the composer its caret back after each send
Every chat box in a tool window locks itself while a message goes out — the input carries `disabled` so nothing typed mid-flight is discarded when the draft res...
Remove the @EntityGraph that broke /leads on Hibernate 6.2
The grid page query failed in production with: ERROR: missing FROM-clause entry for table "a2_1" ... left join member_team_member a2_0 on **************** ...
Mark payload outcomes by column, not through the entity
payloadRepo.save() on a detached payload makes Hibernate walk its graph — organization pulls in org_domains — and that read lands in a transaction that has alre...
Settle each backlog payload as it is processed
processBacklog mirrored the scheduled job's two defects: it mutated payload statuses in memory and saved them in one batch at the end, and it saved the whole en...
Record a payload's outcome by column, not by entity
Marking a payload IMPORTED with payloadRepo.save() makes Hibernate walk the detached entity's graph — including organization, which pulls in org_domains — and t...
Stop overlapping runs importing the same payloads twice
The trigger fires every minute and each run claims work by selecting payloads still in RECEIVED. A backlog that takes longer than a minute therefore still had R...
Bump the processed counter instead of rewriting the endpoint
The job finished a batch by mutating totalProcessed on the endpoint entity it loaded before the batch began and saving the whole row. Two consequences: - it ...
Never fail a submission because its counter update lost a race
storePayload no longer bumps the endpoint's received counter; the receive controller now calls recordReceipt separately, in its own transaction, and swallows th...
Stop losing payloads to endpoint-counter contention
storePayload saved the payload and then bumped totalReceived/lastReceivedAt by dirtying the endpoint entity — in the same transaction. Every submission to an en...
Every country flag in the app was a blocked image
Eight more screens had the defect found in the marketing visitor drawer. The app is served under img-src 'self' data: blob: https://theme.kamocrm.com https:/...
Flags are emoji, because the CSP blocks every flag CDN
The visitor drawer painted a broken-image glyph where each country flag should be. react-country-flag's `svg` mode reads like a self-contained component and is ...
Persist each payload's outcome as it happens, not in one batch
processEndpointPayloads looped over the batch mutating statuses in memory and saved them all at the end. createLead commits per lead, so any failure of that fin...
Move the pool-availability recount after commit
createLead saved the lead and then, in the same transaction, ran countAssignablePool to broadcast the new "Leads Available" figure. On YugabyteDB a read after a...
Stamp every unread frame with the instant its counts were read
The four places that built a member's unread snapshot — the REST read, the frame sent when a message arrives, the frame sent when a session is marked read, and ...
Clear the unread badge for a conversation the member is reading
The badge was fed by two unordered sources — the REST unread read and MediaService's unread topic — and applied whichever landed last, with nothing ever re-read...
Catch the silent version of "sound is not allowed here"
Follow-up to the still. Testing tap-to-play against the deployed site turned up a failure mode the muted fallback did not cover. A refused `play()` rejects, an...
Show the code as a handle, not 36 characters of hex
Moving the token to a UUID left the grid rendering the whole thing, which is correct in a URL and useless in a table: it cannot be scanned, compared against the...
The microservice count reads 64+, not 30+
The number is 64+ services now. Five untranslated surfaces still claimed 30+: the technology answer in the homepage FAQ JSON-LD (which is what a search result q...
Cache CORS preflights for two hours, not 100 seconds
`accessControlMaxAge: 100` meant browsers re-ran the preflight roughly once per visit, so every page load on the marketing site paid two extra OPTIONS round-tri...
Clear every console error and DevTools issue
Diagnosed with Chrome over the debugging protocol rather than by reasoning, collecting exactly what Lighthouse's errors-in-console and inspector-issues audits c...
Clean the console, and restore the static rendering I broke
Three things from the console, one of them much bigger than the other two. THE BIG ONE. Chasing the "Fetch failed loading" lines led to the prefetch payload, a...
The Trusted Types policy was being injected by next/script
The report-only console showed two violations, and one of them was the policy component's own doing: This document requires 'TrustedScript' assignment. Thi...
Stop the edge rate limit from 429ing every cold KamoDesktop load
Opening an assigned Linux instance always landed on Guacamole's generic "An error has occurred and this action cannot be completed" modal, and always worked aft...
A popup with nowhere to dock now overlaps instead of not opening
A tool window — the email composer, a support conversation, a chat, the softphone — would sometimes simply not appear, and be fine after a reload. Three silent ...
Say which link the strip is offering
"Your tracking link" showed exactly one link while a member can hold any number of them, so the strip silently rendered whichever code the sort put first and ga...
A fixed-position banner cannot use a scroll-driven reveal
Fallout from the framer sweep, caught before it could matter. The rewrite maps entrance animations onto `.reveal`, which is driven by `animation-timeline: view(...
The platform runs YugabyteDB, not CockroachDB
Unrelated to the performance work — found while reading the homepage's inline payload, where the string turned up in the FAQ answers. CockroachDB was retired f...
Make the server actually able to read the theme path
Completes the change 48493ae shipped half of. That commit swept four in-flight files — layout.tsx, DynamicMetaLoader, TouchOptimized and ThemedBackground — into...
Stop gating the referral beacon, and report the visit properly
Two corrections to what shipped, both restoring the behaviour this feature was asked for. The beacon was gating itself on the analytics consent record. That re...
Make the two paged tracking reads deterministic
Both paged queries ordered on a column that ties, with no tiebreaker, so the database was free to return tied rows in a different order per page fetch — which s...
Make the HLS playlists immutable, and say what that costs
The playlists were the last entry in Lighthouse's cache-lifetime audit — 300s originally, then an hour, still reported. Everything else in the ladder was alread...
Stop opening a note from overwriting it with a blank body
The editor seeded its buffer with `note.content || ''`, then compared that '' against the incoming null and concluded the member had unsaved edits. Two seconds ...
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.
