Skip to content

BRUH Terminal changelog (archived)

This add-on has been replaced

BRUH Terminal was merged into brAIn along with BRUH Insights, and is no longer developed. This page is kept as the historical record; version numbers below belong to BRUH Terminal, not to brAIn, whose own history starts here.

v3.6.0

Added
  • Full HA administration without touching .storage — 13 new Power Tools (56 total). Helpers (create_helper/delete_helper for all eight storage-backed types, so “build me a guest-mode toggle” just happens), update_zone, entity voice aliases and icon overrides, dashboard lifecycle (create_dashboard/delete_dashboard with automatic pre-delete backup) plus custom-card resources (add_dashboard_resource/remove_dashboard_resource — Claude can install a custom card end-to-end), person lifecycle, and user lifecycle (create_user with optional local login created atomically, delete_user with the owner lockout guard). Full docs →

v3.5.0

Added
  • delete_orphaned_entities gained an entity_id filter — scope the cleanup to reviewed entities; each is re-verified as orphaned at call time and live entities are skipped, never deleted (reported in skipped_not_orphaned).
  • Dashboard editing: update_dashboard (automatic backup of the previous config, last 20 kept) and restore_dashboard (one-call undo), with new MCP tools list_dashboards/get_dashboard as the read half.
  • Registry & dashboard files joined the git backup — the auto-backup previously excluded all of .storage, so Power Tools changes had no backup coverage; the credential-free registry and lovelace* files are now versioned (secrets stay excluded), with a safe one-time migration for existing installs.

v3.4.0

Added
  • BRUH Power Tools — 41 registry-management admin services, adapted from Spook by Franck Nijhof (MIT). Claude, automations, and scripts can now reorganize Home Assistant through safe, supervised bruh_claude.* service calls instead of hand-editing /config/.storage: areas (create/delete/rename, aliases, device & entity assignment), floors, labels (multi-target apply/remove), entities (rename, change entity ID, enable/disable, hide/unhide, orphan cleanup with dry-run default), devices (rename, enable/disable with parent-hub cascade), integrations (enable/disable/reload), zones, persons (device-tracker assignment), blueprints (import from URL), statistics (import/backfill long-term stats), users (enable/disable with owner-lockout protection), diagnostics (find_orphaned_references scans automations/scripts/scenes for dead entity references), and repairs (raise/clear custom issues in Settings → System → Repairs). Everything is admin-gated, validated before any change, and visible in Developer Tools → Actions. Full docs →
  • New MCP tool get_registry — read-only listings of areas, floors, labels, devices, entities, integrations, and users with exactly the ids the services need; the safe replacement for reading .storage files.
  • MCP call_service gained return_response — routes over the WebSocket API and returns service response data (any responding HA service, e.g. todo lists and calendars, not just the new ones).
  • The generated CLAUDE.md context teaches Claude the full catalog, the get_registrycall_service workflow, and the cautions: dry-run first, change_entity_id doesn’t rewrite automations (run find_orphaned_references after), confirm before destructive changes, never edit .storage.

v3.3.2

Fixed
  • “Failed to authenticate: OAuth session expired and could not be refreshed” in Assist conversations and insight cards after 3.3.1, while the sidebar terminal kept working. Before 3.3.1 some launch paths kept a second credential file in the container layer; OAuth refresh tokens rotate, so only the most recently refreshed copy stays valid — and 3.3.1’s credential unification could keep the dead lineage. Salvage now keeps the newer .credentials.json (the older one is preserved as .credentials.json.stale).
  • Auth failures are now detected and actionable. The Assist worker pool and the automation/task listener recognize CLI auth errors, recycle pooled workers, and reply with a clear instruction instead of the raw error: open BRUH Terminal and run /login once — every background channel picks the fresh login up automatically. (If you’re seeing this error today, that one-time /login is the fix.)

v3.3.1

Fixed
  • Having to log in to Claude again after every add-on update (#102). Claude Code’s config/credential directory is pinned to persistent storage with CLAUDE_CONFIG_DIR (/data/home/.claude) instead of being derived from HOME at runtime — code paths that resolved the home directory differently could silently keep credentials in the container layer, which every update wipes. Belt and suspenders: the claude user’s passwd home entry now points at /data/home, credentials found in the old container-layer home are rescued (dotfiles included — .credentials.json itself was previously skipped by the salvage glob), and the last known good credential file is kept in /data/.bruh_claude_auth_backup/ and restored automatically if the live one vanishes.
  • Startup auth diagnostics. The health check no longer warns “OAuth tokens: NOT found” while you’re logged in — it checks the real credential file (camelCase keys) and logs its owner/mode/mtime.
  • “Press c to copy” now works over plain HTTP / LAN access. The modern clipboard API only exists in secure contexts, so on http://homeassistant.local:8123 every OSC 52 copy failed. The terminal now falls back to the legacy document.execCommand('copy') path before bothering you.
Changed
  • Sidebar naming: the ingress panel is now titled “BRUH Terminal” (was “Terminal”) to match the BRUH family branding.

v3.3.0

Added
  • Long-term home memory & learning. A memory store at /config/.bruh_claude/memory/: a user-editable memory.md (preferences, entity nicknames, household patterns), a ≤2 KB voice.md distillate spliced into every voice prompt, and an append-only inbox/ of candidate facts. A background consolidator merges the inbox with one cheap Haiku pass — daily, or early when more than 20 facts are pending.
  • Voice assistants learn. A new remember_fact MCP tool stores facts the moment you state them (“actually, we call that lamp the beacon”), and finished conversations get a bounded background reflection pass that extracts durable facts. Learned knowledge is injected into voice prompts, insight jobs (which also see their previous report for continuity), and the generated CLAUDE.md.
  • ha-memory CLI: add, list, inbox, questions, answer, consolidate, edit, and clear --confirm.
  • New HA services bruh_claude.add_memory and bruh_claude.answer_question feed the memory store from automations.
  • ha-share-login: runs claude setup-token interactively and writes the shared auth file (/config/.bruh_claude/secrets/claude_auth.json, 0600) that other BRUH add-ons like BRUH Insights pick up automatically — one login for the whole family. Also --token, --status, --revoke, --force.
  • Kill switches: new assist_learning and memory_injection options (both on by default), plus memory_max_kb (default 8).
Changed
  • ha-context-gen now preserves your notes: content between <!-- bruh:user-notes:start --> / <!-- bruh:user-notes:end --> survives regeneration, and the generated context inlines the learned home knowledge.

v3.2.5

Changed
  • Renamed the add-on to BRUH Terminal (sidebar panel: “Terminal”) as part of the unified BRUH Apps branding; new “Solid Blocks” icon and logo from the BRUH Automation brand system. No functional changes.

v3.2.4

Fixed
  • Automations calling BRUH Claude failed with “MCP server unavailable” even though voice/conversation still worked. Recent Claude Code builds require project-scoped MCP servers to be approved before they load, and in non-interactive runs an unapproved server is silently skipped. The add-on now writes enableAllProjectMcpServers / enabledMcpjsonServers into the Claude settings it manages — the documented way to trust a project .mcp.json server without the interactive dialog.
  • The Automation listener reads Claude’s structured result (--output-format json.result) instead of scraping verbose stdout, so diagnostic lines can never again be returned verbatim as a task result.

v3.2.3

Fixed
  • No more thread-safety errors when an Insight job finishes. On HA 2026.7 the log filled with calls async_write_ha_state from a thread other than the event loop each time an insight ran, because the sensor’s dispatcher handler was scheduled on a worker thread. It’s now a proper @callback that runs on the event loop — clearing the error today and heading off a hard failure in upcoming HA releases. No change to the sensor’s output.

v3.2.2

Fixed
  • The app can be built and updated again on current Home Assistant. Supervisor 2026.04.0 retired the legacy add-on builder: build.yaml is ignored and the BUILD_FROM build argument is no longer passed, so the Dockerfile’s FROM ${BUILD_FROM} resolved to an empty base image and the build failed before it started. The Dockerfile now carries its own default (ghcr.io/home-assistant/base:3.24, the official multi-arch base); older Supervisors keep overriding it through build.yaml.
  • Hassio auto-discovery works again on HA 2026.x. Core removed the old HassioServiceInfo re-export; the integration now imports it from its current home (homeassistant.helpers.service_info.hassio) with a fallback for older cores.
Changed
  • The volume map uses the current homeassistant_config type instead of the legacy config alias, with an explicit path: /config so every script keeps its long-standing mount point (requires Supervisor 2023.09+).
  • DeviceInfo is imported from its canonical helpers.device_registry location across all platforms, ahead of Core removing the deprecated re-export. The rest of the integration was audited against HA Core 2026.7.1 source — conversation entity, chat-log streaming, options flow, repairs, services, and sensors all use current APIs.

v3.2.1

Added
  • A proper landscape store logo (the previous logo.png was a byte-identical copy of the square icon) and a terminal illustration in the README, so the project leads with a picture of what it does.
Changed
  • Documentation overhaul — a table of contents, a consolidated troubleshooting table, Support / Authors / License sections, a SemVer policy, the enable_mobile_ui option documented, and a corrected automation example (the old one pointed at a task path the listener never watched; use the bruh_claude.run_task service).

v3.2.0

Fixed
  • The terminal no longer opens and instantly closes after an update. Recent Claude Code releases ship a native binary that needs a libc symbol (posix_getdents) only present in musl 1.2.6, so the CLI died the instant you connected. The add-on now builds on Alpine 3.24 (musl 1.2.6), which also restores normal Claude Code auto-updates instead of being frozen on an old release.
  • Startup now verifies Claude Code actually runs after installing it. If a future build ever needs a newer libc than the base image provides, the log says so explicitly — with the fix — instead of leaving a terminal that opens and disappears.
Added
  • Pin Claude Code to a specific version with the BRUH_CLAUDE_CODE_VERSION environment variable (or the CLAUDE_CODE_VERSION Docker build arg), in case a future release ever regresses.

v3.1.0

Added
  • Per-agent service deny-lists. Every voice agent gets a Blocked services picker — choose common high-risk patterns (lock.unlock, alarm_control_panel.alarm_disarm, homeassistant.restart…), a whole domain.*, or type your own. Enforcement is real, not a prompt request: the list is checked in the MCP server’s call_service chokepoint, so a blocked service can’t be reached by any tool or phrasing. A kitchen speaker can be barred from unlocking doors while your office agent isn’t.
Changed
  • Personalities now own identity, tone, and verbosity outright. The voice system prompt used to merge your persona with a competing built-in identity, watering both down. Now a custom personality leads with an explicit precedence note and the operational block (tools, area map, timezone, routing) is identity-free.
  • The mcp_only voice deny-list now also blocks file reads (Read / Glob / Grep), not just writes — voice gets HA data exclusively through MCP tools, so it can’t read secrets.yaml aloud.

v3.0.1

Fixed
  • Blank “Add Service” dialog. Two translation strings contained literal Jinja braces, which broke the frontend’s message-format parser; all strings are now brace-free, with a CI test guarding against regressions.
  • Local time, not UTC. The container now adopts HA’s configured timezone, the voice prompt names it, and every message carries a local timestamp — agents answer “what time is it?” in your timezone with zero tool calls.
Added
  • get_weather_forecast MCP tool — modern HA only exposes forecasts via weather.get_forecasts, fetched here over the WebSocket API so “what’s the weather tomorrow?” works reliably by voice.
  • Much friendlier insight setup — a Run now button on every job’s device page, template previews that pre-fill the prompt box, proper multiline prompt editors, and a one-time notification with ready-to-paste dashboard card YAML after a job’s first run.
  • Model overrides for send_prompt and run_task, an optional notify service per insight job, and a richer bruh_claude_insight_complete event (now with entity_id and a preview) for TTS announcements.

v3.0.0

Added
  • Insight jobs — proactive Claude. Schedule Claude reports (daily briefing, anomaly watch, battery & maintenance, camera check, or a custom templated prompt) rendered to sensor.<job>_insight with a full markdown report and ready-to-paste card YAML. Trigger by interval, daily time, or the bruh_claude.run_insight service.
  • Streaming voice over an internal HTTP API. A worker-pool HTTP API (port 8099, token-authenticated on the shared volume) streams replies into the chat log so TTS starts speaking at the first sentence on streaming-capable pipelines.
  • Health monitoring. binary_sensor.bruh_claude_system_assist_healthy exposes worker count, the pre-warmed spare, and last-request latency.
  • Voice tool scoping (assist_tool_access). mcp_only (default) lets voice use every HA MCP tool but denies shell, file, and web access.
Changed
  • The file protocol is kept as a permanent fallback. If the HTTP API is ever unreachable, both sides fall back automatically — nothing existing breaks.

v2.5.0

Added
  • get_camera_snapshot — Claude can now see a camera and describe what’s visible (“is the garage door actually closed?”), returned as a real MCP image block (downscaled to keep token cost sane).
  • get_history and get_statistics — recent state history (up to 7 days, with min/max for numeric sensors) and long-term statistics over the WebSocket API: “how cold did it get last week?”
Changed
  • Schema-driven MCP dispatch. The hand-written 140-line tool router is replaced by a registry that derives each tool’s argument contract from its own input schema. Adding a tool is now a function, a schema, and one mapping line — with a test that keeps schemas and implementations in sync.

v2.4.1

Fixed
  • Large homes no longer lose their Weather/People voice context. Oversized area maps were truncated mid-list, dropping exactly the sections voice asks about most; Weather/People now come first, the cap is higher, and truncation lands on a line boundary.
  • The spare worker is pre-warmed at startup, so the first voice command after an add-on restart no longer pays the ~20s cold start.

v2.4.0

Added
  • Assist fast mode (default on). A worker-pool daemon keeps a live Claude process per active conversation plus a pre-warmed spare, so even brand-new voice commands skip the CLI boot and MCP handshake. Any worker error falls back to a one-shot invocation; set assist_fast_mode: false for the classic listener.
Changed
  • Area map made version-proof and visible. The area→entity map spliced into the voice prompt now renders on any HA version (pure-core Jinja), gained Weather and People sections, logs failures instead of silently dropping to discovery mode, and reports its size on every request and in ha-selftest.

v2.3.0

Added
  • Conversations resume real Claude Code sessions. The first turn starts a session; follow-ups --resume it, so Claude keeps full context server-side instead of replaying the transcript every turn — fewer tokens, faster replies, complete memory within a conversation.
Changed
  • Snappier voice. An area→controllable-entities map is spliced into the system prompt (no get_areas round-trip for “turn off the kitchen lights”), new agents default to Claude Haiku, and the bridge polls responses every 0.1s.
Fixed
  • The “one answer behind” bug. Per-turn files are now uniquely named and claimed atomically, so a late response can never become the answer to the next turn.
  • Automation tasks longer than 120s are no longer lost — the integration now waits the full task timeout (up to 300s).

v2.2.1

Fixed
  • No more Permission denied noise when scripts (ha-selftest, the login shell) sourced the root-owned env file as the non-root user — the guard now checks readability, not just existence.

v2.2.0

Added
  • get_areas — area/room awareness. Lists every area and its entity_ids so the voice agent can turn “the kitchen lights” into concrete entities without a discovery turn.
  • ha-selftest in-situ diagnostic. A single command drives the whole chain end-to-end — HA API auth, the MCP server over stdio, the deployed integration, the listeners, your Claude login, and the usage sensors — printing PASS/FAIL with a fix hint for anything wrong.
Removed
  • The orphaned legacy token-stats tracker (unused since the token sensors were dropped in 1.9.0) and a few dead code paths in the integration.

v2.1.0

Fixed
  • Scrolling Claude Code’s chat — finally — on both phone and desktop. A one-finger swipe inside the terminal (and a throttled desktop wheel) now pages Claude Code’s own pager via PgUp/PgDn without enabling terminal mouse tracking, so long-press text selection and OAuth-URL copy keep working.

v2.0.2

Removed
  • The experimental 2.0.x custom chat UI is reverted. The FastAPI + Preact surface was a worse fit than native Claude Code in ttyd (with the mobile shim), so the add-on returns to the proven terminal. Existing config needs no changes.

v2.0.1

Added
  • CI now enforces version bumps. Any change to add-on runtime files without a config.yaml version bump fails the build — so a fix can never again sit invisible on main because HA only pulls a new image on a version change.
Fixed
  • Chat UI asset URLs inside HA ingress (since superseded by the 2.0.2 revert).

v2.0.0

Added
  • An opt-in chat UI surface (FastAPI + Preact over a WebSocket) reframing the add-on from “Claude Code in a web terminal” to “Claude Code in your home, surface of your choice.” Default off; reverted in 2.0.2 in favour of the native terminal.

v1.18.0

Fixed
  • Every keystroke double-typed in the web terminal — fixed, kicking off the 1.18.x line that built out the mobile experience: iOS keyboard avoidance through the HA ingress iframe, OSC-52 clipboard copy, and PgUp/PgDn scroll buttons.

v1.17.0

Added
  • Mobile toolbar and iOS dictation fix. An on-screen toolbar above the software keyboard provides the keys iOS doesn’t (ESC, Tab, Ctrl, arrows, ^C, Paste), and the dictation double-word bug is resolved.

v1.14.0

Changed
  • Claude Code now auto-updates on startup — the add-on re-pulls the newest @anthropic-ai/claude-code on every boot (with retries) so you track the latest release without rebuilding.

v1.9.0

Removed
  • Legacy per-token usage sensors in favour of account-wide usage-limit sensors, and fixed an /api/mcp auth error.

v1.8.0

Added
  • Anthropic usage-limit sensors, persistent Claude sessions, and configurable turn budgets (assist_max_turns / automation_max_turns).

v1.5.0

Added
  • HA Repairs flow, OAuth credential persistence, and conversation memory for the Assist agent.

v1.0.0

Added
  • Initial release — Claude Code in a Home Assistant web terminal, with native HA API access via the built-in MCP server, git-based config backup, and auto-generated CLAUDE.md context.

This page highlights notable releases. The complete, unabridged history lives in the CHANGELOG.md in the add-on repository.