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_helperfor 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_dashboardwith 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_userwith optional local login created atomically,delete_userwith the owner lockout guard). Full docs →
v3.5.0
Added
delete_orphaned_entitiesgained anentity_idfilter — scope the cleanup to reviewed entities; each is re-verified as orphaned at call time and live entities are skipped, never deleted (reported inskipped_not_orphaned).- Dashboard editing:
update_dashboard(automatic backup of the previous config, last 20 kept) andrestore_dashboard(one-call undo), with new MCP toolslist_dashboards/get_dashboardas 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 andlovelace*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_referencesscans 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.storagefiles. - MCP
call_servicegainedreturn_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.mdcontext teaches Claude the full catalog, theget_registry→call_serviceworkflow, and the cautions: dry-run first,change_entity_iddoesn’t rewrite automations (runfind_orphaned_referencesafter), 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
/loginonce — every background channel picks the fresh login up automatically. (If you’re seeing this error today, that one-time/loginis 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 fromHOMEat runtime — code paths that resolved the home directory differently could silently keep credentials in the container layer, which every update wipes. Belt and suspenders: theclaudeuser’s passwd home entry now points at/data/home, credentials found in the old container-layer home are rescued (dotfiles included —.credentials.jsonitself 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:8123every OSC 52 copy failed. The terminal now falls back to the legacydocument.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-editablememory.md(preferences, entity nicknames, household patterns), a ≤2 KBvoice.mddistillate spliced into every voice prompt, and an append-onlyinbox/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_factMCP 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 generatedCLAUDE.md. ha-memoryCLI:add,list,inbox,questions,answer,consolidate,edit, andclear --confirm.- New HA services
bruh_claude.add_memoryandbruh_claude.answer_questionfeed the memory store from automations. ha-share-login: runsclaude setup-tokeninteractively 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_learningandmemory_injectionoptions (both on by default), plusmemory_max_kb(default 8).
Changed
ha-context-gennow 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/enabledMcpjsonServersinto the Claude settings it manages — the documented way to trust a project.mcp.jsonserver 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 loopeach time an insight ran, because the sensor’s dispatcher handler was scheduled on a worker thread. It’s now a proper@callbackthat 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.yamlis ignored and theBUILD_FROMbuild argument is no longer passed, so the Dockerfile’sFROM ${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 throughbuild.yaml. - Hassio auto-discovery works again on HA 2026.x. Core removed the old
HassioServiceInfore-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_configtype instead of the legacyconfigalias, with an explicitpath: /configso every script keeps its long-standing mount point (requires Supervisor 2023.09+). DeviceInfois imported from its canonicalhelpers.device_registrylocation 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.pngwas 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_uioption documented, and a corrected automation example (the old one pointed at a task path the listener never watched; use thebruh_claude.run_taskservice).
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_VERSIONenvironment variable (or theCLAUDE_CODE_VERSIONDocker 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 wholedomain.*, or type your own. Enforcement is real, not a prompt request: the list is checked in the MCP server’scall_servicechokepoint, 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_onlyvoice 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 readsecrets.yamlaloud.
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_forecastMCP tool — modern HA only exposes forecasts viaweather.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_promptandrun_task, an optional notify service per insight job, and a richerbruh_claude_insight_completeevent (now withentity_idand 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>_insightwith a full markdown report and ready-to-paste card YAML. Trigger by interval, daily time, or thebruh_claude.run_insightservice. - 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_healthyexposes 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_historyandget_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: falsefor 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
--resumeit, 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_areasround-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 deniednoise 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-selftestin-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.yamlversion bump fails the build — so a fix can never again sit invisible onmainbecause 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-codeon 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/mcpauth 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.mdcontext.
This page highlights notable releases. The complete, unabridged history lives in the CHANGELOG.md in the add-on repository.