Kamo Logo

Live Change Log

See what we're building, in real-time. Every feature, fix, and improvement shipped across the platform.

April 17, 2026
Chorekamo-marketing

Update locale translations and hash [skip ci]

Kamo CI·3h ago
Chorekamo-marketing

Reset translation hash to force re-translation of fallback keys

Kamo·3h ago
Chorekamo-marketing

Update locale translations and hash [skip ci]

Kamo CI·3h ago
Fixkamo-internal

Populate DNS statuses when already confirmed; show org name prominently throughout

kamo·3h ago
Otherkamo-marketing

Translate all remaining hardcoded UI strings site-wide

- PreviewBanner, PublicChatWidget, AiChatPanel, LiveSupportPanel, ExitIntentModal, FloatingSupportWidget now use useTranslations() - Added previewBanner, chat...

Kamo·3h ago
Otherkamo-internal

Prominently warn that www record is optional and can break existing sites

kamo·3h ago
Fixkamo-internal

Remove double scrollbars and horizontal overflow on DNS setup page

kamo·3h ago
Featurekamo-internal

Always show DNS button for owners, add change domain flow

kamo·3h ago
Chorekamo-marketing

Update locale translations and hash [skip ci]

Kamo CI·3h ago
Fixkamo-marketing

Delta translation engine + wire all hardcoded UI strings to i18n

Translation system: - translate.ts now operates in delta mode — only keys that are missing or still identical to English are sent to the API; existing transla...

Kamo·3h ago
Fixkamo-marketing

Suppress Chrome auto-translate popup on locale-switched pages

Add translate="no" to <html> and <meta name="google" content="notranslate"> so Chrome does not offer to translate pages the user has already intentionally switc...

Kamo·4h ago
Otherkamo-internal

Full-width enterprise DNS setup page, success as dismissible banner

kamo·4h ago
Featurekamo-internal

Pass orgId through setup/dns flow for cross-org domain management

kamo·4h ago
FeatureSecurityService

Allow cross-org domain management by verifying user ownership

Kamo·4h ago
FixSecurityService

Bound translation concurrency to 3 threads to prevent DB pool exhaustion

Unbounded @Async (SimpleAsyncTaskExecutor) created 50 threads simultaneously when the retry scheduler fired, each opening a DB transaction and draining HikariCP...

Kamo·4h ago
Fixkamo-internal

Setup domain button always navigates to /setup/dns in current tab

kamo·4h ago
CITranslateService

Retrigger build for bergamot API and provider-order fixes

Kamo·4h ago
FixSecurityService

Three bugs preventing changelog translations from being saved

1. @TransactionalEventListener(AFTER_COMMIT) was discarding events because handleWebhook() had no @Transactional — save + publishEvent() ran outside any t...

Kamo·4h ago
Fixkamo-shared-library

Query CommitLogs with LEFT JOIN so zero-translation records are caught by retry

The old query selected from CommitLogTranslation — commit logs with no translations at all were invisible to it. Use LEFT JOIN from CommitLog so the HAVING COUN...

Kamo·4h ago
Featurekamo-internal

Add /setup/dns page and domain setup flow to /network

- New /setup/dns page with two-phase flow: domain entry then DNS verification with 60-second auto-polling and SSL confirmation - ManualDnsGuide: collapsible s...

kamo·4h ago
FeatureSecurityService

Add /setup/dns backend — one-domain enforcement, SSL probe, new aliases

- Enforce one custom domain per org in POST /api/security/domains - Add capcha, docs, sign to standard aliases; remove legacy aliases - Update verify-dns to tra...

Kamo·4h ago
FeatureInitializerService

Add ssl_confirmed and ssl_confirmed_at columns to org_domains

Adds idempotent ALTER TABLE statements to provision the two new columns needed for DNS setup SSL confirmation tracking.

Kamo·4h ago
Featurekamo-shared-library

Add sslConfirmed/sslConfirmedAt fields to OrgDomain and DomainDTO

Adds two new fields to OrgDomain entity and DomainDTO to track SSL certificate confirmation status after the auto-cert service issues a certificate. Also adds s...

Kamo·4h ago
FixSecurityService

Apply word replacement at translation time, not ingestion

Original text is preserved in the DB so that adding a new rule and re-triggering translation is all that is needed to update existing records. Changes: - Chang...

Kamo·5h ago
Featurekamo-marketing

Remove client-side changelog censoring — now handled by backend

Word replacement and secret redaction moved to ChangelogSanitizationService (SecurityService) so sanitization happens before DB storage and translation. The fro...

Kamo·5h ago
FeatureSecurityService

Move changelog word replacement to backend before translation

Text replacements (Docs→Docs, Meet→Meet, etc.) and secret name redaction (K8s secret names→***) were previously applied client-side in ChangelogClient.tsx, mean...

Kamo·5h ago
Chorekamo-marketing

Update locale translations and hash [skip ci]

Kamo CI·6h ago
Fixkamo-internal

Handle empty API responses and graceful degradation on billing tab

- billingApi get/put helpers now safely handle empty response bodies instead of crashing on res.json() with empty input - PlansBillingTab loadData wraps every...

kamo·6h ago
FixSecurityService

Check TeamMember.isOrganizationOwner flag for owner detection in my-networks endpoint

The previous check only looked at org.getOwner() (user_id_owner column) which can be null for existing orgs. The authoritative owner flag lives on the TeamMembe...

Kamo·6h ago
Fixkamo-internal

Resolve org/member context from *** session for billing proxy

BillingService controllers require X-Org-Id and X-Member-Id headers. When calling directly (bypassing APIService), these weren't being set. Now the Next.js prox...

kamo·6h ago
Fixkamo-internal

Use string type for org/member IDs in network page to handle CockroachDB unique_rowid() precision

kamo·6h ago
FixSecurityService

Serialize org and member IDs as strings in my-networks endpoint to prevent JS precision loss

Kamo·6h ago
Refactorkamo-internal

Call BillingService directly via k8s DNS instead of through APIService

Next.js server-side proxy now calls BillingService at kamowsbilling-service.kamo.svc.cluster.local directly, skipping the unnecessary hop through APIService. Us...

kamo·6h ago
Fixkamo-internal

Add Next.js API proxy route for /api/billing/*

The billing API client was calling /api/billing/* as a relative URL, which hit the Next.js server instead of the APIService gateway. Added a catch-all proxy rou...

kamo·6h ago
Featurekamo-internal

Replace storage add-on toggle with quantity slider

Additional Storage is usage-based ($4/25GB block), not a simple on/off add-on. Replaced the toggle switch with a slider (0-1000GB in 25GB steps) plus a numeric ...

kamo·6h ago
FixSecurityService

Include parent org in /org/domain response

The getOrganizationByDomain endpoint manually builds a response map but never included the parent organization reference. This prevented the frontend from knowi...

Kamo·7h ago
Fixkamo-internal

Add parentId and parent to OrgProviderProps type

The Organization props interface was missing parentId and parent fields, causing them to be dropped during TypeScript compilation even though the backend sends ...

kamo·7h ago
Featurekamo-internal

Wire BillingManager and RelationshipManager to real backends

BillingManager (account billing tab): - Replaced 100% local-state mock with real Stripe-backed payment method management via billingApi - Loads payment method...

kamo·7h ago
FixKlusterServices

Purge incomplete model directories in init container

The service crashes on startup if it finds a directory in /models that has missing or partial model files. Add a sweep at init start that removes any directory ...

Kamo·7h ago
FixKlusterServices

Remove GitHub LFS downloads, use only data.statmt.org models

GitHub raw URLs return LFS pointer files, not actual binaries. Drop enru/enar downloads entirely — LibreTranslate handles those locales. Only download the 4 pai...

Kamo·7h ago
FixTranslateService

Narrow bergamot to es/fr/de/pl, restore bergamot-first order

GitHub LFS files can't be downloaded with plain curl (raw URL returns the pointer not the content). Removing enru/enar from bergamot scope; those locales fall t...

Kamo·7h ago
FeatureKlusterServices

Restore bergamot with working model sources and correct image

- replicas: 1 - Init container (alpine): downloads 4 pairs from data.statmt.org (tarballs for enes/enfr/ende/enpl) and 2 from firefox-translations-models GitH...

Kamo·7h ago
FixTranslateService

Narrow BergamotProvider targets to 6 pairs with available models

pt, it, uk, tr, ro, id, vi have no bergamot model source — LibreTranslate handles them. bergamot now claims: es, fr, de, pl, ru, ar.

Kamo·7h ago
FixKlusterServices

Scale bergamot to 0, update image to mozilla/translation-service

The Google Cloud Storage model download bucket (bergamot-models-sandbox) returns 404 for all files and the firefox-translations-models repo was archived Dec 202...

Kamo·8h ago
FixTranslateService

Route all translations through LibreTranslate while bergamot is offline

BergamotProvider is moved to fallback position. LibreTranslate supports all 13 locales bergamot was handling (es/fr/de/pt/it/pl/ru/uk/tr/ro/id/vi/ar), so this e...

Kamo·8h ago
Featurekamo-internal

Replace mock stats page with live KamoCRM subscription dashboard

Rebuilt /settings/account?tab=stats into a fully wired, read-only insight dashboard. Replaces all mock data with parallel calls to BillingService via the existi...

kamo·8h ago
Fixkamo-login

Proxy *** challenge through login server for multi-domain support

Replaces direct cross-origin fetch to capcha.{domain}/api/challenge with a same-origin proxy at /api/capcha/challenge. The previous approach required a valid TL...

Kamo·8h ago
FixKlusterServices

Scale bergamot back to 1 replica — translation failures caused by missing pod

Bergamot was at 0 replicas with its service still registered. The ProviderRouter in TranslateService had no circuit breaker, so every request for es/fr/de/pt/it...

Kamo·8h ago
FixSecurityService

Don't let null translated description hide the English original in changelog

The translation lookup for non-en locales was unconditionally overwriting description with translation.get().getDescription(), which is null when: - the transla...

Kamo·8h ago
Featurekamo-internal

Complete Choose a Plan flow end-to-end

- Wire PlanCalculator into PlansBillingTab dialog (replaces placeholder) - Fetch available plans from billing API on page load - Handle plan submission: creates...

kamo·8h ago
Live Change Log | KamoCRM | KamoCRM