NewTranslation engine v3.0 — replaced textMap/MutationObserver approach with tHTML() engine that translates strings before DOM insertion. Phrase dictionary with 1,000+ entries, keyed translations, and live audit tool (snI18n.audit()).
NewFull-site i18n coverage — engine + dictionary deployed across all 6 client-facing pages (shell, login, onboarding, index, contact, support).
NewFAQ Japanese localization — all 67 FAQ answers (Understanding SkyNimbus, FinOps Foundations, Module Walkthroughs, New Features, Glossary) translated via dedicated sn-faq-ja.js with DOM replacement.
NewDuplicate connection prevention — POST /api/connections now returns 409 if the same provider + account is already connected. Prevents double-counted spend data.
FixSpend data integrity — identified and removed orphaned spend_records on self-hosted tenant DB that were doubling reported costs ($15k → $8k, matching AWS billing).
FixDemo data cleanup — removed duplicate demo connections (loaded twice) inflating real spend totals. Fixed renderDemoSection() timing so Clear Demo Data button appears reliably in Settings.
FixGovernance maturity gauge — loadMaturityScore() was using broken localStorage.getItem("token") instead of getValidToken(). FinOps Maturity tile now loads consistently.
FixTranslation engine t() function — empty keyed dict entries no longer match as valid translations. Fallback chain: keyed → phrase dict on fallback text → phrase dict on key → English.
ImproveJapanese translations — 3 translation batches covering all 26 modules: nav labels, buttons, status messages, governance terms, budget/forecast/rightsizing/K8s/anomaly/policy/tag/chargeback/reports/CSP/SaaS/settings content.
ImproveChangelog now uses translation engine — version history page translates to Japanese alongside the rest of the platform.
InfraSelf-hosted tenant spend cleanup — connection deletion now properly removes orphaned spend_records from tenant DBs, not just central DB.
Infrai18n architecture: sn-i18n-engine.js (core), sn-i18n-dict.js (1,000+ phrase dictionary), sn-faq-ja.js (67 FAQ translations). MutationObserver as safety net.
NewWeather Station on-prem agent — Go binary architecture for collecting VM utilization from vSphere/vCenter. 4 database tables (agents, VMs, hosts, snapshots), 10 API endpoints, tenant-aware migrations.
NewOn-Prem dashboard module — sidebar entry, empty state with Deploy Weather Station CTA, agent token generation modal, KPI cards, utilization heatmap, waste detection table, host overview.
NewDebug console — floating error panel (Ctrl+Shift+D) catches JS errors, unhandled rejections, console.error/warn, and failed HTTP fetches with stack traces.
NewAuto-translate innerHTML prototype override — intercepts Element.prototype.innerHTML setter so all dynamic content translates automatically. Zero manual wrapping needed.
FixEngine: skip empty dictionary entries during loading — 857 auto-extracted empty entries were blocking real translations. One-line fix unlocked all translation batches.
FixConnection delete uses req.tq() for spend_records cleanup — self-hosted tenant databases properly cleaned on connection removal.
Improve3 additional translation batches — architecture components, settings danger zone, empty states, glossary. Dictionary total: 3,500+ entries across 26 modules.
NewAuto-translate innerHTML prototype override — intercepts Element.prototype.innerHTML setter so all dynamic content passes through tHTML() automatically. Zero manual wrapping needed for existing or future code.
FixEngine: skip empty dictionary entries during loading — 857 auto-extracted entries with empty values were blocking real translations from matching. One-line fix unlocked all translation batches.
FixConnection delete now uses req.tq() for spend_records cleanup — ensures self-hosted tenant databases are properly cleaned when connections are removed.
Improve3 additional translation batches (4, 5, 6) — architecture sandbox components, settings danger zone, remaining UI labels, empty state messages, glossary definitions. Total dictionary: 3,500+ entries.