Make the startup fee findable — discreet is not the same as hidden
The note shipped at #8c8c8c with no spacing, wedged between the bright green term line and the plan description. That is DARKER than the body copy beneath it, s...
The end-terminal confirm was unreadable over the row behind it
Two things, both about the seam between a navigator and what is beside it. ## The confirm had no surface of its own A terminal row's actions sit OVER the row ...
Make the strike meter agree with its own caption, and read aloud
Three things the screen was getting wrong, all found by looking at it rather than by running it. The bar was a TALLY of failures, wrapping every five segments....
The lockout warning promised the wrong rung, and the wrong count
The strike meter on the sign-in screen was telling people something the server then did not do. tierFor starts the five-second delay at the SIXTH failure, but a...
Expose what a seat change will cost before it is made
Raising a subscription's seat count now raises an invoice — a per-seat startup fee follows the person, so ten hires on a $99 plan is $990 and a large account ru...
Send an organization's mail as its own domain when its SPF says we may
The From address was chosen by asking who hosts the organization's MAILBOXES. That is a different question from the one that matters, and it was wrong in both d...
Point the seat, payment-method and add-on calls at routes that exist
Four calls in posApi addressed REST-shaped URLs — /seats, /payment-method, /addons, DELETE /addons/{id} — and POSController exposes none of them. It has change-...
Let the console ask what a seat change costs before making it
changeSeats now raises an invoice for the startup fee on new heads, which turns a number in a dialog into a charge — ten hires on a $99 plan is $990, and on a l...
Remove the last "$0 setup" claim, and quote the fee only where it is fixed
Rendering the calculator turned up a claim the first pass missed: its "Included Free!" panel led with "Setup & Implementation — $0", struck through against a co...
Record which domains authorize us, so their mail can go out as them
Transactional mail currently picks its From address by asking who hosts an organization's MAILBOXES. That is the wrong question. Whether we may send as chinilaw...
Record whether a domain's SPF authorizes us to send as it
Two columns beside the ownership and SSL flags, answering the third DNS question about a domain: may we put its name on the From line of the transactional mail ...
A catalog-version bump must not read as "this host has no organization"
Org resolution funnels every lookup through one query helper that swallows the exception and answers Optional.empty(). For an organization that genuinely is not...
A put-away terminal's hexhead says whether it wants you
A member with six terminals minimized has one question about each: is that one waiting for me? The head now answers it in a colour. green working — nothing ...
Carry a terminal's activity state to the console
TerminalSummary gains `state`: busy, or waiting for its member. Read off the session's transcript — neither of which is knowable from here, which is why it trav...
Give a head the app's own tooltip, placed from where it sits
The label was the browser's native `title` box: unstyled, and put wherever the other 291 hover targets in this chrome use, arrow and all. A head is not a norma...
State the startup fee, and stop claiming there isn't one
The site said "$0 setup fees" three times in the pricing page's metadata and listed "No mandatory onboarding fees" as an advantage over HubSpot. All of it is no...
Show the startup fee before it is charged, and where a deal overrides it
calculate-price has always returned a setupFee and the order wizard printed it nowhere, so a charge that runs to four figures on a large order reached the custo...
Seed the $99 per-seat startup fee on every paid tier
The loader passed null for setupFee on all four plans, so a freshly seeded environment priced onboarding at nothing while production charges $99 a seat — the ki...
Bill the startup fee on both routes to a plan, and record negotiated terms
Two routes reach the same plan and only one of them was going to charge the new per-seat startup fee. A sales-written order bills through SubscriptionService, w...
Charge the startup fee, per seat, and let one customer out of it
The startup fee has been half-built for as long as the model has existed. SubscriptionPlan carried a setupFee, SubscriptionOrder carried a setupFee, OrderLineTy...
Retry the database errors Yugabyte expects a client to retry
Applying DDL bumps the catalog version, and every physical backend still holding the old one fails its next statement with SQLState 40001 — "schema version mism...
Retire the SMS provider's test verdict when its credentials change
The same defect as the phone server's Overview tab, one screen across: saving new credentials left the previous Test Connection result on display, so a "Test fa...
Say whether a terminal is working or waiting for its member
Every terminal in the listing now carries `state`: busy, or waiting. It is the one question somebody asks of a window they cannot see, and it is what a minimize...
Restore SpfAdvisoryService, which main no longer compiles without
45829a6 deleted this file. Nothing in that commit wanted it gone — it was a staged deletion of mine that a concurrent `git add -A` picked up, and the same commi...
Catch the app credentials pasted into RingCentral's JWT box
Two things went wrong on the same screen, and together they produced a settings page showing a green "Credentials complete" chip above a red "RingCentral instan...
Tell a RingCentral JWT from the app credentials pasted into its box
An org pasted its RingCentral app's credentials JSON — the {"clientId": …, "clientSecret": …, "server": …} blob the developer console shows on the same page as ...
Pick the model and effort before starting a coder session, once
Send To AI dialog has, and the two are the SAME choice rather than two. Somebody who has settled on Sonnet at High has settled on it. Re-picking in the other p...
Carry the member's model and effort to a coder session
and deliberately not examined here. `coder_flags` on the agent is the one thing that decides what a session runs with — its own comment calls it "the security ...
Let a coder session run at the model and effort the member picked
for a new session and for a resumed one alike, since `--model` and `--effort` are per-session flags either way. They are the ONLY part of the command a caller ...
Name a hexhead after the window it stands for
A hexhead's tooltip read "User w12" — the head id, which is the window id, in a string written for member avatars. A dock of six minimized windows was six ident...
Point the integrations proxy at the path EmailService serves
The Manage Sources dialog forwarded to /api/settings/integrations, which EmailService does not map — its controller is at **************** Every request from th...
Drop the /api/settings forward, which pointed at nothing
EmailService serves the sync-integration controller at **************** not /api/settings/integrations — so that forward reached a path the service does not map...
Say why a mailbox sync failed, and what key is on file
Two silences that made a working Google Workspace connection read as broken. The mailbox sync caught the provider's rejection and dropped it. Google refuses th...
Stop a provider config save from discarding another form's fields
Every config panel posts only the fields it owns, flat, alongside the provider type -- the Google Workspace panel sends nothing but serviceAccountJson. PUT /api...
Route /api/contacts, /api/calendar and /api/settings to EmailService
KamoMobile's contacts and calendar screens 404'd on every request. Neither path was routed at the api host, so nothing reached EmailService and the service logg...
Send To AI must not open a tab in sage's editor
A Send-to-AI hand-off is hosted in a Remote Terminal the operator is already watching in the console. On top of that, the agent also handed the session to VS Co...
Refuse a sign-in whose host names no organization
Such a host could sign in until now. It fell through to the workspace-choice path and succeeded on membership alone, which made it a door where none of the tena...
Restarting the agent must not kill every member's shells
mid-work today, and would have taken every other member's terminals with it. systemd's default is KillMode=control-group: on stop or restart it SIGKILLs every ...
A coder terminal wears the name coder gave the conversation
running had long since been titled "Startup fee implementation and Harmony account adjustment". Two separate things were swallowing that name. **The listing.**...
Show the sign-in lockout as a rule that cannot be switched off
SecurityService now applies a progressive sign-in lockout to every organization whether or not a row exists for it — five free attempts, then five seconds, then...
Name the constructor Spring should use, or the context will not start
My own regression, and the second context-startup break on this service today: Error creating bean with name 'terminalTicketRegistry': Failed to inst...
Let Spring pick the terminal registry's constructor
SecurityService has been crash-looping on every new pod since the shared handoff store landed: "No default constructor found" for TerminalTicketRegistry, which ...
Show the progressive lockout, so a held sign-in explains itself
The server now refuses sign-ins on a ladder — five free attempts, then five seconds, then locks of five, fifteen and thirty minutes, then a permanent block. Wit...
Rebuild now the registry's stale blob-descriptor cache is cleared
ROOT CAUSE, for the next person who sees "short read: expected N bytes but got 0: unexpected EOF". The registry runs storage.cache.blobdescriptor: inmemory. Bl...
Rebuild — the previous run never produced an image
f0edd01 was pushed with the rest of the fleet-wide rollout-safety work and is the only one of that batch whose image never appeared: the deployment is still run...
Progressive sign-in lockout, escalating to a permanent IP block
A wrong password now costs something, and the cost climbs. Counted since the subject's last successful sign-in: the first five failures are free, the sixth and ...
Rebuild after clearing the registry's dangling layer links
The previous two builds (2862548, dd323bc) both produced images that could not be pulled: short read: expected 3985350 bytes but got 0: unexpected EOF Cause...
Tell the server which organization the resend is for
The verification screen's Resend button has been reporting success and sending nothing for every organization except the platform's own. `host` already rides i...
Resend the verification e-mail under the organization the member is actually on
Nobody at a white-labelled organization has been able to ask for a second verification e-mail. The screen said the letter was on its way every time, and no lett...
Say out loud when a registrant is left with no verification token
The register endpoint caught a failed verification send and logged warn(e.getMessage()). For the fault it kept hitting — EmailService raising a Yugabyte read re...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.