Drop unused @ts-expect-error on streaming fetch body
The `as RequestInit` cast already silences the type error; the directive is redundant under TS strict mode and breaks the production build.
Chats list with infinite scroll, virtualized via IntersectionObserver
Proxy routes for find-or-create, members, attachments, imaging proxy, mute, revoke
Extract shared **************** helper to app/lib/mediaServiceUrl.ts. Add proxy routes: find-or-create, members, receipts, attachments (streaming), mutes, revok...
Distinguish actively-translating vs queued messages
The streaming queue was already strictly sequential (one fetch at a time), but every queued message rendered "Translating…" because they all shared the same pen...
Show error icon when a message fails to translate
When the per-message translate call returns translated:false, errors out, or times out, the chat bubble now renders a small red ErrorOutline icon in place of th...
Persist language change and show current language in tooltip
The members endpoint accepts PUT not PATCH, so the language picker's PATCH was silently ignored — Member.language never actually updated, which is why refreshin...
Forward query string on ****************
The Next.js proxy was dropping the request query string when forwarding to MediaService, which meant the chat history fetch's ?lang=<locale> param was silently ...
Stream message translations newest-first on language switch
When the user picks a new language (or opens an existing chat in a language different from the messages' source), every bubble that needs translation immediatel...
Revert "fix(settings): show Plans & Billing tab regardless of root-org status"
This reverts commit ****************
Translate chat messages into the viewer's language
Adds a "My Language" flag picker in NavTop (left of the email tool, separated by a vertical rule). Selecting a language writes back to Member.language and syncs...
Show Plans & Billing tab regardless of root-org status
The !isRootOrg gate hid the tab on root orgs and blocked org owners and self-viewers from reaching their billing page from "My Account". The PlansBillingTab its...
Translate hardcoded UI strings
setup/dns (6 files): page, AliasStatusTable, DnsProgressView, DnsProvisioningPanel, DomainEntryForm, ManualDnsGuide. settings (10 files): diagnostics, essential...
Drop in place — jump every member, no softPush on release
The drift on release was softPushCluster firing on the user-drop path. A mega-cluster's bounds extend in all directions from the anchor, so the PADDING-margin /...
Translate hardcoded UI strings
account/view: 40 strings reused from existing namespace (no new keys). kb (13 files): translate article editor, viewer, reviews, resources, versions, navigation...
Translate remaining hardcoded UI strings
Tasks page: Save Changes, Close, Add Task Item To Automation Stream, Edit title tooltip. Notes page: Dismiss, Loading notes, Delete Note dialog title. Doc manag...
Replace hardcoded English with t() across leads pages
Translate remaining hardcoded UI strings in allotments, new, reports, and view/[id] to use next-intl. Add scripts/i18n-audit.py to detect remaining hardcoded st...
Drop firmly in place — tail-only throw + jump() to clear velocity
The previous fix still let heads drift on release because: 1. Throw detection averaged velocity across the full 110ms window. A user who flicked then decele...
Drop in place after a paused drag instead of drifting
Two cooperating bugs caused dropped heads (single or post-gather) to fly off to seemingly random positions when the user dragged fast, slowed to a stop, then re...
Add Personal + Chat/Docs/Notes/KB/HRS sections
The /settings index showed no sections to non-admins because every existing section was gated on an admin right (CONFIGURE_SYSTEM, MANAGE_*_SETTINGS, MANAGE_ACC...
Rotate goal opening based on viewport aspect ratio
The goal frame now tilts by atan2(viewportH, viewportW) so its open right side aims toward the viewport diagonal — for 16:9 monitors the opening points ~29° sou...
Throw-to-remove goal with score/miss celebrations
A 132×132 goal frame appears in the upper-left whenever a head is in solo-drag or active-throw, offset 56px from the corner so heads can miss past or behind it....
Throw physics with pool-table collisions and comet trail
Flicking a head past the throw threshold launches it across the viewport under explicit physics (friction, edge bounce, head-vs-head elastic collisions). Slow d...
Cancel inherited drag velocity on release
The drag handler updates the head's motion value with rapid mx.set(nx) calls, which framer-motion uses to compute velocity. When the release path triggered a so...
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...
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...
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.
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
CustomerMemberId is member ID string, resolve accounts by primaryMemberId
- posApi: AccountSummary uid string, add primaryMemberId; **************** customerMemberId string; **************** customerId string - SubscriptionOrderWizard...
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...
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 ****************
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 **************...
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.
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.