iotta / CHANGELOG.md
📖 CHANGELOG.md

Changelog

All notable changes to iotta are documented here. The format follows Keep a Changelog and the project uses Semantic Versioning; until 1.0, the minor version tracks development phases (see docs/roadmap.md).

Maintaining this file: add an entry under ## [Unreleased] in the same commit as any user- or operator-visible change (feature, behavior change, fix, or config/CLI/API/ protocol change), grouped under Added / Changed / Deprecated / Removed / Fixed / Security. Skip only for internal-refactor-only or docs-only changes. On release, move [Unreleased] under a new ## [x.y.z] - YYYY-MM-DD heading and bump the version in both server/pyproject.toml and client/pyproject.toml. Full rules: CONTRIBUTING.md.

Unreleased

Added

  • Operator UI dark mode toggle: a β˜€/πŸŒ™ button in the header persists the choice to localStorage (iotta-theme) and applies it immediately; follows the OS preference when no explicit choice has been made.
  • Operator UI empty-state demo content: Agents, Devices, Registry, Traces, and Reports views show illustrative example rows (muted, non-interactive) with a banner notice when no real data exists yet, so new operators see what the UI looks like before anything is added.
  • Operator UI localization infrastructure: web/i18n.js provides a t(key, vars?) function with a comprehensive English locale; all static UI strings in every view file now go through t(). Adding a new locale requires only a setLocale("fr", { … }) call with the translated dict β€” no code changes.
  • Operator UI field hints: form fields in Agents, Devices, Firmware, and Registry create/edit dialogs now display a short explanatory line below the input (hint: property on form field defs, rendered as <small class="field-hint">).
  • Operator UI button tooltips: action buttons with non-obvious effects (Bind, Rotate token, Decommission, Release…, Rollout check, Roll back, Pre-authorize, Import CSV) carry a title attribute shown by the browser on hover.
  • Operator UI Simplified Chinese (zh-CN) locale: web/locales/zh-CN.js provides complete translations for all UI strings. A locale toggle button in the header cycles between EN and δΈ­ζ–‡, persisting the choice to localStorage (iotta-locale); the page reloads on switch so module-level view titles resolve to the correct language. Adding further locales requires only a new locale file and one import line in app.js.
  • D7 live consumption: settings store now drives live server behaviour. config.apply_settings overlays the active document onto the typed Config; the lifespan applies it at startup (so health_history and rollout.enabled take effect); _get_effective_config() is the per-request resolver for session tracing flags; and the rollout loop re-derives its policy thresholds on every pass so store changes take effect without a restart.
  • Config-as-data layer (D7): runtime-mutable settings in a versioned store (draft β†’ staged β†’ active, schema-validated), over the declarative config file. New iotta-config CLI, /admin/config API (read/set/promote/export/import), an Operator UI Settings view, and a settings: config block. Settings documents are exportable/importable between instances with forward-only schema_version migration.
  • Infrastructure observability (D3): OpenTelemetry traces + metrics and structured JSON logs over OTLP, plus an optional self-hosted monitoring bootstrap (docker-compose.observability.yml).
  • Product positioning docs: docs/product.md (what-it-is, executive summary, feature outline, xiaozhi comparison) and docs/commercialization.md (open-core model, device-cap enforcement design, pricing sketch).
  • docs/readiness-roadmap.md β€” commercialization gap analysis and prioritized roadmap.
  • CONTRIBUTING.md plus a changelog-maintenance policy documented in CLAUDE.md and AGENTS.md.
  • Settled licensing (dual-licensed open-core): LICENSE (FSL-1.1-ALv2) for the core source and LICENSE-COMMERCIAL.md for the paid edition (device-cap unlock + commercial features, key-activated).

Changed

  • Operator UI Settings layout: the editor is a readable-width column with inputs/dropdowns sized to their content (not stretched full-width), and the active-version line is now a status chip (coloured dot) so it reads as live state rather than static prose.
  • Operator UI copy in plain language: rewrote the Settings descriptions (and gave each setting a human label, with the dotted key shown as a faint reference) and de-jargoned view subtitles and trace labels β€” e.g. "Run the automatic health-gated rollout policy loop" β†’ "Automatic rollout control: let the server undo a release if devices start crashing…", and "ASR β†’ LLM β†’ TTS" β†’ "what was heard / assistant reply / spoken back".
  • Operator UI theme toggle uses monochrome inline-SVG sun/moon icons instead of the β˜€/πŸŒ™ emoji (which render inconsistently across platforms β€” the moon looked like a banana on Windows).
  • Rewrote README.md: accurate project status, value summary, Docker + from-source quickstart, CLI/env reference, and a documentation index.

Fixed

  • Operator UI rendered blank (empty nav + content): an unescaped ASCII double-quote in two Simplified-Chinese locale strings terminated the JS string early, and since app.js imports every locale at load, that syntax error blanked the whole UI in any language. Fixed the strings and added a Python-side guard (test_web_assets.py) that fails the suite on unbalanced quotes in any locale entry.
  • iotta-restore: apply a PEP 706 data filter when extracting the backup archive (safe sandboxed restore).

Planned (roadmap)

  • 3rd-party API call inspector (per-call request/response, latency, tokens, cost, errors).
  • Interactive browser-based device simulator (scenarios convertible to evals).
  • License-key entitlement with a Community device cap.
  • Multi-user roles (RBAC) + audit log (commercial tier).

0.7.0 - 2026-06-07

First version-tracked release. Establishes the baseline: the platform is feature-complete through the durable-deployment work, and now carries customer-facing positioning and versioning discipline. Summary of the capabilities present at this baseline:

Added

  • Voice runtime β€” FastAPI session server (WebSocket), streaming pipeline with real-time interruption, provider-agnostic ASR/LLM/TTS (OpenAI reference adapters), MCP tool channel.
  • Software device client β€” protocol-faithful device in software (mic β†’ Opus β†’ speaker).
  • Observability (Phase 2) β€” per-session JSON traces with raw-audio sidecars; trace replay against new prompt/model/ASR.
  • Tool & prompt registry (Phase 3) β€” versioned artifacts with a draft β†’ staged β†’ active lifecycle; CLI + read-only HTTP query surfaces.
  • Eval pipeline (Phase 4) β€” scored scripted suites pinned to prompt/tool versions; persisted run reports.
  • Device operations (Phase 5) β€” device registry, groups/cohorts, provisioning, and OTA with immutable signed firmware, staged percentage rollouts, min-version gating, rollback, and health-gated auto-rollback driven by a crash signal; per-device session tokens; health telemetry + history.
  • Operator UI (Phase 6) β€” authenticated /admin API plus a dependency-free, build-step-free web UI covering every administrative operation; live device state and in-place liveness polling.
  • Durable persistence & deployment (Phase 7) β€” per-store SQLite, Docker/Compose deployment with TLS via a bundled reverse proxy, iotta-doctor preflight, iotta-backup/ iotta-restore, a System status view, and browser-compatible session auth.