The Opt Out tab keeps its content off the card walls
SettingsView's white card and TabPanel carry no padding; every settings tab supplies its own, and this one did not, so its heading, buttons, figure cards and li...
Pages and settings tabs fill their width instead of a centred column
Drop the max-width and auto-margin caps that held pages and settings tabs to a slim centred column. Where lifting a cap would leave one column of form fields st...
The organization owner sees the Opt Out tab, its menu entry and its card
A brand-new right is held by nobody the day it deploys; gating only on MANAGE_EMAIL_OPT_OUTS would hide the tab from whoever could grant it. Matches Sales Scrip...
A background nothing can draw is reported, not a lost batch
The org setup wizard's Backgrounds step resized each picked or suggested image in a loop with no catch. Since resizeBackgroundIfNeeded now refuses, with a reaso...
A saved background shows the member's picture, never the platform's
Behavior & Labeling pointed each tile at the slot's public URL the moment the commit returned, before provisioning had written the slot (it had not even been re...
Let the server say whether the viewer sees every organization
/network chose between all-networks and my-networks from the platform-rights context. That read fails closed and stays failed until the page reloads, and a god ...
A saved campaign reopens inside its template, and the From is always the bulk sender's
The body is saved between two comment markers inside the finished email, and reopening a campaign puts only that part back in the middle of the template, where ...
The campaign editor's Recipients and Send steps fill the width instead of an 860px column
Review fixes for the bulk sender, warm-up and pacing banner
A pass over everything the bulk sender and warm-up screens are built from, fixing what it found: - a warm-up poll that started while a write was on the wire co...
Email settings redirect lists its hook dependencies
The rights check that sends a member without MANAGE_EMAIL_SETTINGS back to /settings ran in an effect that listed only `loading`, so the linter flagged the miss...
The bulk sender tab fills the width it is given
The tab sat in a 1120px column centred in the settings card, so on a wide screen most of the card was empty margin around a narrow form. The column is gone, alo...
A relay that never signs in counts as a configured bulk sender
/marketing/email let an organization send campaigns only once its bulk provider had a stored password. The platform relay listens on port 25 with no TLS and no ...
Recipient grid fills name, source and error from either row shape
The campaign recipient grid read name, sourceType and errorMessage from rows that only carried email, status, sentAt and lastError, so three of its five columns...
A missing mailing address no longer blocks sending
The preflight treated an org with no address on file as an error and kept Send and Schedule disabled. The address still goes in the footer when there is one; wh...
The campaigns grid read counts the API never sent
EmailService's CampaignDTO carries a campaign's counters flat (totalCount, sentCount, failedCount, suppressedCount, bouncedCount, queuedCount), but every screen...
The launch bar ends at the form column, clear of a docked chat window
On /network/create the readiness meter and the Launch organization button sat in a bar across the whole page, under the brand preview too - exactly where docked...
Binders and Uploads read as live buttons in the org's brand
The two tabs looked disabled because they were: a MUI Tab with no <Tabs> parent defaults to textColor="inherit", which draws the whole tab at 60% opacity unless...
The rim's lead current stays white-hot all the way round
Its gradient was pinned to the hexagon's box rather than travelling with the arc, so for a third of every lap the current was gold on the gold rim and simply va...
A window's scrollbars no longer show through the window on top of it
Maximizing a tool window left a column of scrollbar buttons from the window behind it floating in the middle of the pane, and two overlapping floating windows s...
MUI text is set in Geist, not Helvetica and Arial
I18nProviders handed the Geist font to createTheme as an overlay, and overlays are merged in after the theme is built. By then MUI has already written its Robot...
Every Chats sub-tab fits, with the same gap between each
The Interaction Center's Chats strip gave its seven tabs seven equal shares of the 550px pane, 78px each whatever they said. "Team Members" needs 91px, so it wa...
Stop a revoked executive's window; raise only chats waiting on the desk
- A MEMBER_REMOVED naming the viewer unsubscribes the transcript, empties it, disables the composer and says why. Revoking Exec2Exec Access used to leave th...
Raise the conversation when a customer writes, and on a reply
An executive's message reached nobody at KamoCRM: nothing on the console read an Exec2Exec frame. Exec2ExecDeskOpener now raises that customer's window β named,...
The nudge the inviter could never send, and a chat invite that rejoins
**Nudge.** The rail hid the button unless it was the opponent's turn, which reads as a rule about fairness and is a rule about nothing β the server has never ha...
One "on" colour, and a retry that does not cascade
Two things left over from the categories table. The allow swatch was tinted by whether the setting is locked β primary for locked, a green for unlocked. The lo...
The envelope dashboard could not tell "not emailed" from "not opened"
The warning naming an undelivered invitation lives in the send response, so it is gone the moment the dialog closes. After that the dashboard is all there is β ...
The particles ran at the monitor's speed, and the chips were unreadable on two denominations
Two deferred things finished, both measured rather than eyeballed. THE PARTICLE LOOP IS TIME-STEPPED. `PixelParticles` advanced physics once per FRAME β every ...
Four things about the celebration only a browser could say
Measured in Chrome against the real component, not reasoned about. The headline was sized at a flat 13cqw, which is right for a number and wrong for a word: CH...
The opening effect's cancel guards were guarding nothing
`cancelled` was declared, read seven times, and never assigned β the effect returned no cleanup β so every `if (!cancelled)` in the load that opens a window was...
Early Bird and Twenty Doors read the laptop's clock, not the member's
`check-server-timestamps` was red on main: `rememberToday` bucketed the day with `new **************** which is the BROWSER's zone. The guard exists because tha...
The chips were on the table, not on the felt
A member reported that the player opposite them had chips half off the table. Measured in a browser: NINE of the ten piles were off the cloth. The reader's own ...
The computer's reply was silent against the quickest level
The four move cues carried an 80ms throttle. Each is raised once per published frame the board could prove it understood, and a frame is a move β so there was n...
Six the adversarial review upheld
Ten reviewers, three skeptics each. Twelve findings survived; most of the rest were refuted because they had already been fixed. Of the twelve, six were still r...
What an adversarial read of the whole thing found
Ten reviewers over the change, three skeptics per finding. These are the ones that survived, and most of them were in the wiring rather than in the parts that h...
Looking at an organization is not being in it
A workspace signed in to KamoCRM repainted itself as BluEleven - logo, colours, favicon, tab title, and the feature set driving the navigation - while every rec...
Three things a browser said and jsdom could not
The panels were built and tested entirely in jsdom, which can say a label is present and cannot say how wide it ended up. Rendering them at the widths ChessTool...
The chips in the middle are worth what the number says
A settled pot draws the CONTESTED total now, not everything that went in. `hand.pot` keeps every chip that entered the hand; `totalPot` reports what was played...
The Games icon appeared for organizations that have no Games app
Reported on harmonyhomeloans, whose owner saw the icon in the top bar for an app their organization does not have, cannot enable in Apps & Features, and whose c...
The reveal turned your own cards face down, and four more from review
An adversarial review of the choreography commit, verified against the code. Six defects, two of which only a browser could have shown. YOUR OWN CARDS. The sho...
The compact rail clipped a payout flag off the top of the window
The rail reserves a fixed strip above the pucks so a label does not make the strip taller and move the board β but it reserved room for ONE row and the showdown...
The table list had nothing between it and the lobby header
The lobby's scroll container carried `px` and `pb` and no `pt` at all, so the first table's top border sat exactly on the container's edge, flush against the he...
The wedge is yellow, and it stops depending on the tenant's brand
`/icon/cheddar.svg` was five paths of pure #000000 β a black cheese wedge, which on the nav bar's dark ground was very nearly nothing at all. It is a real chedd...
Four defects only a real browser could show
Rendered the felt, the compact layout, the lobby and the action bar in headless Chrome against a fabricated table and MEASURED them. Four things were wrong, and...
The two mode plates were clipped by their own scroller, at every size
The selected plate lifts 2px and carries a 1px ring, and it is the first child of an `overflow-y: auto` column β so its top border sat 3px above the clip edge a...
The proxy could still be walked out of, because a dot is not encoded
The catch-all re-encodes each segment, and the comment claimed that meant it could only ever address the chess API. `encodeURIComponent('..')` is `'..'` β dots ...
The error test did not typecheck, and next build runs tsc
`await promise.catch((e: Error) => e)` does not give you an Error. The catch handler's return type unions with the promise's resolve type, so the result is `Che...
The BFF route that was never written, and an error that was a megabyte of HTML
Pressing Start game returned 1,529,239 bytes of markup. `/api/media/*` is not a proxied prefix β every path under it is a hand-written Next route and there is n...
AppType hid two live apps, and the guard could not see the place they were hidden
The Java app enum is mirrored into TypeScript twice, and only one of the two was guarded. AppType.ts β the mirror Organization's app getters actually read β had...
A black piece on the Kamo board was the colour of the square under it
Only a browser found this. The Kamo scheme derived its piece colours from `--color-primary` as well as its squares, and both mixed the same token into similar d...
Dial the detail dialog's tel: through the shared normaliser
The dialog built `tel:${action.tel}` by hand because telHref() was not on main when it landed β it was in a concurrent branch, and importing it then would have ...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.