Crispen hexagon outline at all sizes/states
Four sources of softness eliminated: - **************** on the SVG - **************** on the visible outline so the stroke width does not stretch (and blur) u...
Refuse when session orgID does not match host org
auto-login accepted any *** and minted an OTK pointing back at it, regardless of which org the destination internal.* host belongs to. A stale or cross-org *** ...
Use server-minted OTK to switch into new org
Prefer the otk returned by POST /api/security/org over the follow-up /api/security/enter-as round-trip. The server now mints a fresh owner session as part of or...
Mint owner ***+OTK on org create
After createOrganizationOwner, mint a fresh *** bound to the new owner TeamMember and return its OTK alongside id/members. Without this the creator stays on the...
Per-cluster spacing + same-size grouping rules
Cluster cell and hex adjacency are now derived from the cluster's largest member instead of the global scale, and follower MVs include a center-alignment offset...
Hide popover when Invite to Meeting opens the dialog
The popover used to stay open underneath the meeting dialog because the dialog was conditionally rendered inside the popover's target gate. Capture the invitee ...
Rewrite drag/cluster system with magnetic snap and gather gesture
Replace the monolithic HexHeadGroup (847 lines) with a modular cluster engine under app/components/chat/hexheads/. Single source of truth: every head lives in a...
Robust English fallback for missing and empty locale translations
- mergeWithFallback now treats empty-string locale values as untranslated, falling back to the English value instead of rendering nothing - Replace bare NextI...
Update orders page account uid type from number to string
AccountSummary.uid is now a string (Long precision fix). Also remove parseInt comparison and type="number" from the manual account ID field.
Remove @PostConstruct COMP provisioner — fix existing orders directly in DB
approveOrder() already handles new COMP orders. One-time data gap for existing orders is corrected directly in the database.
Remove manual provision-comp endpoint — startup self-heals
COMP orders are now provisioned automatically on SecurityService startup via SubscriptionService @PostConstruct. Manual endpoint no longer needed.
Self-heal unprovisioned COMP orders on startup
On @PostConstruct, scan all APPROVED COMP orders and provision any that lack an AccountSubscription. Idempotent — find-or-create means safe to run repeatedly.
Use CommerceMarket.getId() instead of getUid() in provisionCompSubscription
CommerceMarket uses @Id UUID id (not uid), so Lombok generates getId().
Move availability status dropdown to left side before My Businesses
Relocates the status pill from the right action bar to the left welcome section, placing it between the greeting separator and My Businesses with a divider. Rem...
Add targetOrganizationId to SubscriptionOrder types and createSubscriptionOrder
Add provision-comp endpoint to activate COMP subscription from approved order
POST **************** calls **************** then invalidates entitlements for the target org via EntitlementService.
COMP order approval auto-provisions AccountSubscription and assigns license
- SubscriptionOrder: add targetOrganization (nullable FK to orgs) - **************** add targetOrganizationId string - AccountRepository: add findByPrimaryMembe...
CustomerMemberId is member ID string, resolve accounts by primaryMemberId
- posApi: AccountSummary uid string, add primaryMemberId; **************** customerMemberId string; **************** customerId string - SubscriptionOrderWizard...
Serialize customerMemberId as string to preserve Long precision
- AccountSummaryDTO: annotate uid with **************** and add primaryMemberId string field populated from primary_member_id - CreateSubscriptionOrderRequest: ...
Replace click-to-open with action popover + size controls
Clicking a hex head now opens a polished glass-morphism popover with contextual actions instead of immediately opening its tool window. Member chat heads expose...
Add MEMBER_UI_PREFERENCES table (order 60)
Idempotent CREATE for the generic per-member UI-preference store backing the hex-head popover size selector and future per-member UI settings. Schema mirrors th...
Add MemberUiPreferenceController for per-member UI settings
Backs the new hex-head popover size selector and any future small per- member UI preference. Endpoints under /api/security/members/me/ui- preferences resolve th...
Add MemberUiPreference entity for per-member UI prefs
Generic per-member UI preference store (memberId, prefKey, JSONB value) for small persisted UI settings. First consumer is the hex-head popover size selector.
Complete next-intl for System Diagnostics
Wire remaining MySQL, Redis, statistics, request, and accordion UI copy to components.settings.diagnostics keys; use locale-aware time and translated heap badge...
Revert "feat(billing): wire FeaturesManager to platform subscription for child-org gating"
This reverts commit ****************
Revert "feat(billing): add platform-subscription endpoint for cross-org feature gating"
This reverts commit ****************
Wire FeaturesManager to platform subscription for child-org gating
FeaturesManager was calling legacy **************** which throws (ungated fallback) instead of reading the real platform subscription. Now calls **************...
Add platform-subscription endpoint for cross-org feature gating
Child-org admins (like GNosia's owner Daniel) have their COMP subscription orders on the root KamoCRM org, not on their own org. FeaturesManager was querying t...
Legacy getCurrentSubscription stub must throw, not return null
Returning null made FeaturesManager treat every org as having no subscription (billingLoaded=true, hasSubscription=false), locking all feature toggles behind an...
Use translated aria-label for SettingsView tabs
Reads **************** from next-intl.
Ambient json modules for gitignored messages/*.json imports
`tsc` and the IDE resolve `messages/` JSON after merge without requiring committed files under messages/. Extend include for types/**/*.d.ts.
I18n for legacy hub content/sidebar via settingsLegacyHub
Replace hard-coded English with next-intl. Introduces stable topic id constants; activeTopic is compared against ids instead of translated display strings.
Scope SettingsSearchBar to components.settings namespace
Use **************** with searchBar.* keys instead of global t() with full dotted paths.
Wire landing page to settingsLanding translations
Replace hardcoded feature cards and section copy with useTranslations- backed strings from **************** including ICU branch label for branch types cards. C...
Move account settings help panels to message keys
Replace all hardcoded help copy on the organization account page with scoped useTranslations keys. Extend i18n-audit to report files missing translation hooks f...
Wire organization account hero and tabs to i18n keys
Use **************** strings for SettingsView title, subtitle, and tab labels so the UI shows translated copy instead of raw placeholders left in dictionary ove...
Move translations to kamo-translation-dictionary
All 22 locale files move to the centralized kamo-translation-dictionary repo. The CI now clones that repo and copies the kamo-marketing/ folder into messages/ b...
Move translations to kamo-translation-dictionary
All 22 locale files move to the centralized kamo-translation-dictionary repo. The CI now clones that repo and copies the kamo-internal/ folder into messages/ be...
Wire MUI Tooltip titles through common.actions and common.tooltips
Replace literal single-line Tooltip title strings with tCommon("actions.*") or tCommon("tooltips.*"), merge keys into messages/en.json, and fix nested component...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.