Handing back to Kamo's app writes only the switch
Choosing "use Kamo's application" sent the whole form with the disable, so an edit the member had typed and not saved was persisted by a choice they would not h...
Drop the unused dense prop from OrgOAuthAppSection
No call site passed it, and all eight embeds want the full header. A prop kept for a caller that does not exist is API surface someone has to reason about later...
A switch per platform registration, and bring-your-own on the org side
Each OAuth2 card on Platform Configuration → Advanced gets an enable/disable switch in its top-right corner. It writes only the enabled flag, is unavailable unt...
Start one from the Interaction Center tab
The tab listed terminals and gave a member no way to open one — the only starting points were the Linux Desktop submenu and the navigator's header, neither of t...
Read the theme folder from the host on a white-label workspace
orgSlug reached DynamicMetaLoader only when the organization was named via ?org=, so on internal.<customer domain> - where the host names exactly one organizati...
Publish an advert externally, and pick the candidate back up
Three changes, all in service of the new public job board at careers.<apex>. The posting editor gains "list on our public careers site". It sits with status an...
The tab strip declared minHeight twice, so the build never type-checked
Adding icons to the panel tabs appended a second `minHeight` to the same `& .MuiTab-root` literal instead of replacing the old one. TypeScript rejects a duplica...
Footer Badges — a row of images under the signature
The Content tab's 'Footer Image' was one picture chosen from three fixed sources and sized by a percentage. It is now 'Footer Badges': the same three plus anyth...
Add the VOIP_CALL_EVENTS scope
Lets an org issue kamo-asterisk-support a key for reporting ringing extensions, separately from VOIP_RECORDING_UPLOADS. Uploading a recording after the fact and...
Send to AI opens the terminal it runs in, and the tabs get icons
A dispatch now comes back naming a terminal, and the console opens it. That is not a courtesy view of something already underway — the hand-off is PREPARED on t...
Apply in one request, and say why a role cannot be applied to
Follow-up to a review of my own commit. Six real findings. APPLYING IS NOW ONE REQUEST. The résumé used to upload after the application was created, and a fail...
The navigator had no surface of its own, so it was transparent
ChatNavigatorPanel draws no background — it is a positioned, animated shell, and the column inside it is what makes it opaque. ChatSwitcherColumn supplies `bg-w...
Jobs Available on /hr, and a Careers tab for every member
Two surfaces over one feature. /hr/careers is where HR writes the adverts and reads who applied; **************** is the internal board an employee browses and ...
A list of your live shells, in the panel and beside the window
Terminals joins the Interaction Center to the right of Sales Scripts, gated on a provisioned dev machine — the same gate as the Linux Desktop nav option, read o...
Composed mail broke lines mid-word, for every recipient
Quill 2's getSemanticHTML() -- the value react-quill-new hands to onChange, and so every byte of body a member types -- ends its text conversion with .replaceAl...
A "why can't I accept?" override on the filter bar
Right-aligned on the /leads filter bar, wearing the Leads nav icon with the same prohibited emblem — so the thing on the nav that says "you are blocked" and the...
A password shortcut in the hero, and a narrower gate
Two halves of the same subject. The shortcut. Changing your password was three rooms deep behind the rail — the one thing the room layout made genuinely harder...
A new terminal could reattach to an old shell after a refresh
The shell was keyed on the tool window's id, and @kamo/tool-core builds those as `${toolId}-${++idCounter}` from a counter that RESETS on every page load. So th...
Prohibited nav emblem, Assign to Myself, and obfuscated contact masking
**The Leads nav icon says when you cannot accept.** A member who holds leads they have not worked gets a red block emblem over the Leads icon and a tooltip nami...
Flags on languages, and stop copying platform lists
Completes c20bac57. Languages now carry their flag, the same one the NavTop switcher shows and from the same source — the closed value as well as every row in ...
Record what the Remote Terminal deploy actually taught
Three defects, all the same shape: present in the tree, absent from the thing that serves requests — an IngressRoute in a directory nothing applies, a client pa...
The ticket request had no route behind it
The window fetched **************** and nothing served it. There is no catch-all under /api/security — every area is proxied by a route file of its own, and the...
A custom-rendered field can be edited again
Completes c20bac57. Field's `renderValue` was returning in place of the whole read view, which included the button that opens the editor. So any field that ren...
Rebuild My Profile as a hero and five rooms
**************** was one 1,999-line component rendering thirteen identical cards down a single column. One SectionCard helper gave all of them the same radius, ...
A real Linux terminal in a tool window, and a submenu to reach it
The Linux Desktop nav option becomes a menu instead of a launch — Remote Desktop with its sizes, Remote Terminal — exactly as the softphone owns call, voicemail...
A fourth window state — float, drag to detach, drag to reorder
A popup tool window has had three states: docked in the row along the bottom, maximized over the viewport, or minimized to a chat head. This adds FLOATING — det...
Name a company by its company, with the contact as the qualifier
A record that is both an organisation and a person is now labelled "Harmony Home Loans (Nickolas McGarry)" everywhere one string has to stand for it. Company on...
Drop the scope line above the Communication View timeline
"Every call, text, e-mail, note and chat message with the 9 leads matching these filters." — the filter bar sits directly above this timeline and already says w...
Communication View — the whole filtered book as one timeline
Three changes to /leads. Quick search moves into the hero, above the CRM Settings links. In the filter row it was the last control on a line of eleven dropdown...
Static CSS in the overlay — 19 interpolations were hanging every build
kamo-internal has been unable to produce an image since b08f3b34. `next build` did not fail, it HUNG: no output, no error, no timeout. `.next` frozen at 1.3 MB ...
Add JustCall as a phone server type
Adds JustCall to the picker at **************** with its API key and secret, a contacts-import toggle, credential status on the providers tab, and the logo. Th...
Reap superseded builds unconditionally — the sha check protected the orphan
The reaper added in 199e367e compared each container's commit against github.sha and KEPT the matches, on the theory that a matching sha meant "this run". That ...
Reap builds orphaned by cancel-in-progress — they were starving the real one
Builds had gone from 8 minutes to 30+. I blamed the heap and was wrong. Reading the runner instead of the numbers found it: THREE `next build` processes at 213%...
Stop the inline image toolbar re-rendering on every scroll frame
measure() runs on each scroll and resize event and built a fresh state object every time, so the toolbar re-rendered whether or not anything about the image had...
The Desktop size tooltip no longer covers its own options
The Tooltip wrapped the whole TextField, so it anchored to the same box the select's option list opens over — at the default bottom placement it landed directly...
Give next build 8 GB, it has been thrashing against 4
Builds went from 7-9 minutes to 30+ a few commits ago and nobody had a reason why. Measured on the runner rather than guessed: `next build` sat at exactly 4.39 ...
The upgrade offer no longer chases comped organizations
The pill suppressed itself for coverage.source === 'PAID' and nothing else, so a comped organization was shown "33% off your plan" — a discount on a price it do...
A paper colour per block, and blocks that fit their text
BLOCKS NOW FIT THEIR CONTENT. The reader's blocks were all 200px tall whatever they held, because richTextExtension configures the editor with minHeight: 200px ...
Add the JustCall provider logo
The VOIP logo folder had FreePBX, Microsoft and RingCentral but no JustCall mark, so any surface listing JustCall as a provider had nothing to render.
The order wizard must name the organization it entitles
The wizard collected a customer and never a target organization, so every order it wrote carried target_org_id NULL. On approval provisionCompSubscription falls...
Never send a cid: the message is not carrying
Completes the inline-image work that landed inside b08f3b34, whose message describes only the KB and sales-scripts fix it was committed alongside. extractInlin...
ReadOnly now actually stops you typing
REPORTED: the script blocks in the Interaction Center are editable. They were, and so is every other "read-only" rich-text surface in the app. `readOnly` on Kb...
The org's colour, not indigo, and a real scrollbar
THE PURPLE WAS A HARDCODED ACCENT. Every tinted surface in the panel and the Sales Scripts pane drew from --accent-comms (#6366f1), so a white-labelled org got ...
The composer is a sub-page, and collapsing no longer eats your text
Four reported problems, one of them destructive. COLLAPSING A PART DESTROYED IT. Collapse UNMOUNTED the editor, and KbArticleEditor is seeded once from a value...
Impersonate was disabled on every row
Gated on canEnterOrg, which is the VIEWER's own membership — and a platform operator has no membership in the organizations impersonation exists for. So the but...
Archived is a SUB-TAB of Sales Scripts, and pad the page
Two bugs, both mine. ARCHIVED WAS A PEER TAB. Active Scripts and Archived Scripts are two views of one screen, not two screens, and they belong as sub-tabs the...
Impersonate, so an operator can open an org as one of its members
Shown beside Enter on every /network view for a platform administrator holding the new IMPERSONATE right. A different right from SYSTEM_USER and deliberately no...
The owner can see the tab that grants the right
REPORTED: "I am also an admin and I don't see the new Sales Scripts tab under /settings/features/crm." Correct, and it was invisible to EVERY organization, not ...
Un-skip the parity guards, and pin without blocking the page
TWO PARITY TESTS HAVE NEVER RUN. Both resolved RoleRightType.java through **************** — that is ~/Java/kamo-shared-library, while the checkout is *********...
Price every line against the seat count, everywhere it is shown
The row Amount under 'What you are quoting' was still previewLineTotal, so the quantity cell showed the quote's seat count while the Amount beside it priced the...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.