[0.23.0] - 2026-02-19
Changed
- Replaced Bulma CSS framework with a custom
ht-prefixed design system featuring cool slate surfaces, warm amber accent, and Space Grotesk + JetBrains Mono typography (#262) - Extracted all design tokens into
tokens.csswith[data-theme]selector support for future theming (#262) - Redesigned dashboard with app status chip grid, activity timeline, and streamlined layout (#262)
- App detail pages now use a flat single-page layout with collapsible metadata, inline tracebacks, and instance switcher dropdown (#262)
- Bus listener and scheduler job tables show expanded detail rows with predicate, rate-limiting, and trigger information (#262)
- Replaced hardcoded CSS fallback colors in alerts and detail panels with proper design tokens (
--ht-surface-inset,--ht-surface-code,--ht-warning-*,--ht-danger-*) - Toggle buttons now show fallback text before Alpine.js initializes and expose
aria-expandedfor accessibility (#262) - E2E tests now run by default with
uv run pytestinstead of requiring-m e2e; addednox -s e2esession for CI HassetteHarnessnow uses a fluent builder API (with_bus(),with_state_proxy(), etc.) with automatic dependency resolution instead of boolean flags (#253)- Consolidated duplicate mock Hassette, DataSyncService, and web test helper fixtures into shared factories in
test_utils/(#253) - All test helper functions now exported from
hassette.test_utilspublic API; tests import from the package instead of submodules (#253) - Replaced 28
asyncio.sleep()synchronization calls across 8 integration test files withwait_forpolling helper for deterministic, faster tests (#253) - Renamed
create_mock_hassette()tocreate_hassette_stub()andmock_hassette.pytoweb_mocks.pyto clarify web/API stub vs harness distinction (#259) - Added autouse cleanup fixtures for bus, scheduler, and mock API to prevent test pollution in module-scoped fixtures (#256)
Fixed
- WebSocket service now fires disconnect event and marks not-ready immediately on unexpected connection loss, preventing stale state in StateProxy (#270)
- App detail page now uses the actual instance index instead of hardcoded 0, fixing data/URL desync for non-zero instances (#262)
- Detail panel labels now have proper text contrast on dark
--ht-surface-codebackground (#262) - Collapsible panels and tracebacks no longer flash visible before Alpine.js initializes (#262)
- Entity browser "Load more" button now appends rows instead of replacing existing ones on domain-filtered views (#247)
model_dump()andmodel_dump_json()onAppManifestandHassetteConfigno longer leak extra fields (e.g. tokens from environment variables)
Added
supports_*boolean properties on light, climate, cover, fan, media_player, and vacuum attribute classes for checking entity capabilities without manual bitmask operations (#272)IntFlagenums (LightEntityFeature,ClimateEntityFeature, etc.) matching Home Assistant core feature flags (#272)- Global alert banner showing HA disconnect warnings and failed app errors with expandable tracebacks (#262)
ht-btn--ghostandht-btn--xsbutton modifier classes (#262)extrasproperty andextra()helper onBaseStateandAttributesBasefor safe access to integration-specific attributes (#271)- JSDoc comments across all web UI JavaScript files (#251)
- ESLint linting, TypeScript type-checking, and
mise run lint:js/mise run typecheck:jstasks (#251)
Removed
Full Changelog: v0.22.1...v0.23.0