Let a reader send the seat-fee article to someone they know
A "pass it on" form at the foot of **************** reached from a chip at the top and a line after the seven questions. The reader names up to three people and...
Email an article to someone, as the platform org, with a working opt-out
A visitor on the marketing site can send the seat-fee article to up to three people. POST /api/internal/article-share (X-Internal-Auth, like every other /api/in...
Put every page in /sitemap.xml itself, and list pages only in the languages they have
/sitemap.xml was an index, so opening it showed 79 file names rather than the site's pages. - /sitemap.xml is now one <urlset> with every page: 18,700 of them,...
A department's Select checks the members it is showing
The Directory's per-department Select used to switch the whole list into select mode with nothing checked, and read "Done" until pressed again. It now checks ev...
Public service announcement on who keeps software seat fees
New page at **************** explaining, for non-technical owners, how resold white-label platforms work: a flat agency license, per-seat fees the agency keeps,...
An echo of the censored English is not a translation
translatedLocales compared each translation with the English title as stored. The translator is given the censored title (ChangelogSanitizationService masks sec...
The General tab counts what the Organizations tab calls Active
6c8d789 moved the platform overview's organization count onto findAllLive(), which also drops orgs created by synthetic (is_fake) accounts — so the General tab ...
List every page in every language it exists in, and make each page agree
/sitemap.xml listed each page once, as its English URL. The 17,843 changelog entries had no language alternates at all, and every page's own hreflang named all ...
Say which locales each public article is really translated into
The marketing site's sitemap now lists every language version of every help-center, documentation and API-reference article, and each article page names the oth...
Say which locales each entry is really translated into
The marketing site's sitemap now lists every language version of every entry, and each entry page names the others as its hreflang alternates. A translation row...
Void an organization from Platform -> Configuration -> Organizations
The Organizations tab gains Active and Void sub-tabs, and each organization's drawer a way to void it — or, on the Void tab, to restore it. - Active / Void sub...
The roster no longer names a voided organization
An organization voided from Platform -> Configuration -> Organizations (orgs.is_active = FALSE) does not exist anywhere but the console's Void tab. findOwnedOrg...
Active and Void tabs in the platform org directory
The console's Organizations tab now splits into Active and Void sub-tabs. A voided organization is orgs.is_active = FALSE (set by SecurityService's void endpoin...
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...
Void an organization, and let no way in reach a voided one
Platform -> Configuration -> Organizations can now void an organization. The void is orgs.is_active = FALSE; this commit adds the action and makes every way INT...
A voided organization is left out of every listing and host lookup
Platform operators can now void an organization from Platform -> Configuration -> Organizations. The void is orgs.is_active = FALSE — the flag sign-in and host ...
Topic titles in the bar's dropdowns sit on a darker plate of the brand
A menu's own name at its top and every section heading (Support's "Online Support", "Bugs & Enhancements", "Training"; Docs' "Create new") now sit on a rounded ...
Rebuild for Doc Manager's "Docs & Files" tab label
No code change. The label comes from kamo-translation-dictionary 649b24cb, which the image build clones into messages/ at build time, so it only reaches the sit...
Faces on messages only in conversations of three or more
A face beside every message tells people apart, and between two people the side a message is drawn on already does that - so the corner face now appears only wh...
The faces answer says how many people are in the conversation
GET **************** now carries `participants`: the console puts a face beside each message only when three or more people are in a conversation, since between...
Order sitemap <url> children as the schema does, and give each chunk one address
The sitemap XSD is a sequence: loc, lastmod, changefreq, priority, then extension elements. The hreflang links were written straight after <loc>, which Google t...
Generate the sitemaps per request, and give every change its own page
/sitemap.xml was a metadata file prerendered at build time, in a container that cannot reach KBService or SecurityService, so every deploy shipped a sitemap wit...
Give every public entry an address, and page the list on the server
The public changelog served entries with no identifier, so the marketing site could neither link to one nor list them in a sitemap. Each entry now carries a slu...
Every message wears its author's face, on the bubble's corner
In every chat popup tool window - Chat, Support, Exec2Exec, Social, SMS, AI Chat - each message now carries a 16x16 photo that overlaps the bubble's top-left co...
The Signature Requests tab, and a colleague's save in the template editor
Signature Requests, between Templates and Common in the Docs manager: every document the collection's templates sent out for signature, in a grid paged on the s...
Signature requests for the Docs manager, with new counts per member
The Docs manager gets a Signature Requests tab: every document a collection's templates sent out for signature, in three buckets by signatures (nobody, some, or...
A save reaches every colleague with the template open
A save of a template's file told only the member who saved it, so a colleague with the same template open kept placing fields over pages the file had moved on f...
Count the files a document keeps only as old versions
A category that keeps versions holds every earlier file of a document in img_versions, each on its own content-addressed file. The storage meter, the quota and ...
A face for every message in every chat window
GET **************** answers, for one conversation, the photo to draw beside each message: everybody on it now AND everybody who ever wrote in it (a roster forg...
A meeting link in the conversation, always on the platform's Kamo Meet
POST **************** lets either side of an Exec2Exec conversation add a meeting link, behind the same gate as sending a message. The meeting is created as the...
Add a meeting link to the conversation - always the platform's Kamo Meet
Both sides of an Exec2Exec window now carry the camera the other chat windows have: Add a meeting link. The meeting is created by MediaService as the PLATFORM o...
Sharing a document works again, as someone who can read it
The share dialog sends a document id as a string — an img id is an int64 past 2^53, which a JSON number would round — and createShare cast it to Number. Every s...
The desk's filters, faces and presence; an Exec2Exec badge that burns
Interaction Center > Chats > Exec2Exec gets two filters under the sub-tabs: Org Owner (All | Org-less | Org Owner) and Order By (Last Message | Latest Sign In) ...
Files and Templates, version history, and versioning settings
Members asked for documents that keep their history the way their organization chooses, and for templates that stand on their own instead of the Originals/Modif...
Faces on the desk — a client's photo, last sign-in and presence
The desk's roster now carries, for every client, their own photo (users.avatar_id, built on the operator's live theme host — the only one their console loads im...
Read a template's layer by design version
The version history draws a template's fields over each version's pages. It asked for them through a document version (/{imgId}/{n}/design), and a template's wo...
Kamo-careers picks up a branding change within a minute
The comment beside the Careers Logo Overlay said the careers site re-reads config.json hourly. It re-reads it every minute since kamo-careers 14c9ddb, which fix...
Upload a new version of a document
The one way to change a file the document editor cannot open - a PDF above all, which is what most templates are. POST **************** takes the new file, scan...
Saving a template's fields is a version of the template
A template is a document with a layer of fields over it, and a version of it is both halves: its bytes and that layer. Its underlying file's saves already reach...
Files and templates, edited in place, with the versions each category keeps
A document was two records: the upload, which nothing edited, and one modified copy derived the first time anyone opened it in either editor. The Docs manager s...
Document versions, and the versioning mode an organization chooses
Documents were two records: the upload, which nothing edited, and one modified copy derived the first time anyone opened it to edit. Members found the pair conf...
A Nav Logo Overlay and a Careers Logo Overlay
Behavior & Labeling gains two more logo overlays in the vocabulary the other six use - a token, resolved against the org's own palette: - "Nav Logo Overlay", d...
Bake the careers site's logo overlay into config.json
kamo-careers paints the org's logo in its header and has no OrgContext; it reads the theme config.json on the server, the same file login, register and apps tak...
A logo overlay for the nav rail and one for the careers site
Two more columns in the vocabulary home_logo_overlay established: a token, not a hex, so an org that rebrands keeps an overlay that matches its new colours. Bot...
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 minimized Exec2Exec head runs a current of light round its rim
A line to KamoCRM's executives must never sit in the dock looking like one more chat. Its minimized head now carries an energy rim: a gold-to-white-to-sky arc r...
A conversation reaches the phone
A message on an Exec2Exec line now goes to the recipients' phones as well as their consoles: the customer's phone when KamoCRM replies, every desk member's phon...
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...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.