Integrate Google Analytics (G-W9K0Z7FYRV) via Next.js Script component
Fix translations — manual overrides + full delta retranslation
Manual overrides for nav/UI terms both engines consistently fail on: - nav.home, nav.company, nav.roadmap, nav.changeLog, nav.legal, nav.login, nav.documentat...
Show TXT domain ownership record in DNS setup UI
- DomainData/DnsStatus: add verificationToken, ownershipVerified, type fields - AliasStatusTable: show TxtOwnershipCard above CNAME table with copy button, in...
Fall through to next provider when translation equals source text
Bergamot was returning the source text unchanged for single-word nav items, acronym phrases (API, CRM), and compound words (Change Log) while reporting success ...
Generate TXT verification token on domain create, check in verify-dns
- createDomain: generate 32-char UUID token and store via setVerificationToken - verifyDns: check _kamo-verify TXT record for kamo-site-verification=<token> - T...
Add verification_token and ownership_verified columns to org_domains
Add domain ownership verification via DNS TXT record
- OrgDomain: add verificationToken and ownershipVerified fields - DomainService: add setVerificationToken() and setOwnershipVerified() - DomainDTO: expose verif...
Sticky header, updated aliases, always-visible plain-English DNS guide
Update required aliases — add app, capcha, docs, sign; remove legacy
Reset translation hash — LibreTranslate OOMKill fixed, retry translations
Populate DNS statuses when already confirmed; show org name prominently throughout
Translate all remaining hardcoded UI strings site-wide
- PreviewBanner, PublicChatWidget, AiChatPanel, LiveSupportPanel, ExitIntentModal, FloatingSupportWidget now use useTranslations() - Added previewBanner, chat...
Prominently warn that www record is optional and can break existing sites
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...
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...
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...
Three bugs preventing changelog translations from being saved
1. **************** was discarding events because handleWebhook() had no @Transactional — save + publishEvent() ran outside any transaction. Add @Transact...
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...
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...
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...
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.
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...
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...
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...
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...
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...
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...
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...
Use string type for org/member IDs in network page to handle CockroachDB unique_rowid() precision
Serialize org and member IDs as strings in my-networks endpoint to prevent JS precision loss
Call BillingService directly via k8s DNS instead of through APIService
Next.js server-side proxy now calls BillingService at **************** directly, skipping the unnecessary hop through APIService. Uses BILLING_SERVICE_URL env v...
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...
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 ...
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...
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 ...
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...
Like what you see shipping?
Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.